malEval args =
case args of
[ expr ] ->
- Eval.withEnv
- (\env ->
- Eval.modifyEnv (Env.jump Env.globalFrameId)
- |> Eval.andThen (\_ -> eval expr)
- |> Eval.finally (Env.jump env.currentFrameId)
- )
+ Eval.inGlobal (eval expr)
_ ->
Eval.fail "unsupported arguments"
(\env ->
Eval.modifyEnv (Env.enter frameId bound)
|> Eval.andThen (\_ -> evalNoApply body)
- |> Eval.finally (Env.leave env.currentFrameId)
+ |> Eval.finally Env.leave
+ |> Eval.gcPass
)
>> Eval.fromResult
>> Eval.map
(\bound ->
- -- TODO : choice Env.enter prematurely?
- -- I think it is needed by the garbage collect..
MalApply
{ frameId = frameId
, bound = bound
printError : Env -> MalExpr -> String
printError env expr =
- "ERR:" ++ (printString env False expr)
+ "Error: " ++ (printString env False expr)
{-| Read-Eval-Print.