1
1
mirror of https://github.com/github/semantic.git synced 2024-12-15 01:51:39 +03:00
This commit is contained in:
joshvera 2018-12-06 16:16:25 -05:00
parent 14a47d8711
commit 192943889b
2 changed files with 41 additions and 49 deletions

View File

@ -81,21 +81,19 @@ instance ( FreeVariables term
)
=> Carrier (Abstract.Function term address (Value term address) :+: sig) (Abstract.FunctionC term address (Value term address) (Eff m)) where
ret = FunctionC . const . ret
eff op = FunctionC (\ eval -> handleSum (eff . handleReader eval runFunctionC) (\case
eff op =
let closure maybeName params body scope = do
packageInfo <- currentPackage
moduleInfo <- currentModule
Closure packageInfo moduleInfo maybeName params body scope <$> currentFrame
in FunctionC (\ eval -> handleSum (eff . handleReader eval runFunctionC) (\case
Abstract.Function name params body scope k -> runEvaluator $ do
packageInfo <- currentPackage
moduleInfo <- currentModule
currentFrame' <- currentFrame
let closure = Closure packageInfo moduleInfo (Just name) params (Right body) scope currentFrame'
Evaluator $ runFunctionC (k (Rval closure)) eval
val <- closure (Just name) params (Right body) scope
Evaluator $ runFunctionC (k $ Rval val) eval
Abstract.BuiltIn associatedScope builtIn k -> runEvaluator $ do
packageInfo <- currentPackage
moduleInfo <- currentModule
currentFrame' <- currentFrame
let closure = Closure packageInfo moduleInfo Nothing [] (Left builtIn) associatedScope currentFrame'
Evaluator $ runFunctionC (k closure) eval
val <- closure Nothing [] (Left builtIn) associatedScope
Evaluator $ runFunctionC (k val) eval
Abstract.Call op params k -> runEvaluator $ do
boxed <- case op of
Closure _ _ _ _ (Left Print) _ _ -> traverse (trace . show) params *> rvalBox Unit

View File

@ -556,14 +556,35 @@ instance Eq1 Module where liftEq = genericLiftEq
instance Ord1 Module where liftCompare = genericLiftCompare
instance Show1 Module where liftShowsPrec = genericLiftShowsPrec
instance Evaluatable Module where
eval eval Module{..} = do
name <- maybeM (throwEvalError NoNameError) (declaredName moduleIdentifier)
declareModule :: ( AbstractValue term address value m
, Carrier sig m
, Declarations term
, Member (Allocator address) sig
, Member (Deref value) sig
, Member (Reader (CurrentFrame address)) sig
, Member (Reader (CurrentScope address)) sig
, Member (Reader Span) sig
, Member (Resumable (BaseError (EvalError address value))) sig
, Member (State (Heap address address value)) sig
, Member (State (ScopeGraph address)) sig
, Member Fresh sig
, Member (Reader ModuleInfo) sig
, Member (Resumable (BaseError (AddressError address value))) sig
, Member (Resumable (BaseError (HeapError address))) sig
, Member (Resumable (BaseError (ScopeError address))) sig
, Ord address
)
=> (term -> Evaluator term address value m (ValueRef address value))
-> term
-> [term]
-> Evaluator term address value m (ValueRef address value)
declareModule eval identifier statements = do
name <- maybeM (throwEvalError NoNameError) (declaredName identifier)
span <- ask @Span
currentScope' <- currentScope
let declaration = Declaration name
moduleBody = maybe (rvalBox unit) (runApp . foldMap1 (App . eval)) (nonEmpty moduleStatements)
moduleBody = maybe (rvalBox unit) (runApp . foldMap1 (App . eval)) (nonEmpty statements)
maybeSlot <- maybeLookupDeclaration declaration
case maybeSlot of
@ -590,6 +611,9 @@ instance Evaluatable Module where
rvalBox unit
instance Evaluatable Module where
eval eval Module{..} = declareModule eval moduleIdentifier moduleStatements
instance Declarations1 Module where
liftDeclaredName declaredName = declaredName . moduleIdentifier
@ -601,38 +625,8 @@ instance Ord1 InternalModule where liftCompare = genericLiftCompare
instance Show1 InternalModule where liftShowsPrec = genericLiftShowsPrec
instance Evaluatable InternalModule where
eval eval InternalModule{..} = do
name <- maybeM (throwEvalError NoNameError) (declaredName internalModuleIdentifier)
span <- ask @Span
currentScope' <- currentScope
let declaration = Declaration name
moduleBody = maybe (rvalBox unit) (runApp . foldMap1 (App . eval)) (nonEmpty internalModuleStatements)
maybeSlot <- maybeLookupDeclaration declaration
case maybeSlot of
Just slot -> do
moduleVal <- deref slot
maybeFrame <- scopedEnvironment moduleVal
case maybeFrame of
Just moduleFrame -> do
withScopeAndFrame moduleFrame moduleBody
Nothing -> throwEvalError (DerefError moduleVal)
Nothing -> do
let edges = Map.singleton Lexical [ currentScope' ]
childScope <- newScope edges
declare (Declaration name) span (Just childScope)
currentFrame' <- currentFrame
let frameEdges = Map.singleton Lexical (Map.singleton currentScope' currentFrame')
childFrame <- newFrame childScope frameEdges
withScopeAndFrame childFrame (void moduleBody)
moduleSlot <- lookupDeclaration (Declaration name)
assign moduleSlot =<< klass (Declaration name) childFrame
rvalBox unit
eval eval InternalModule{..} =
declareModule eval internalModuleIdentifier internalModuleStatements
instance Declarations a => Declarations (InternalModule a) where
declaredName InternalModule{..} = declaredName internalModuleIdentifier