{
ast: .,
env: env,
- ret_env: retenv,
+ ret_env: (if retenv != null then (retenv | setpath(["atoms"]; env.atoms)) else retenv end),
finish: (continue | not),
cont: true # set inside
};
def _interpret($_menv):
reduce .value[] as $elem (
- [];
- . as $dot | $elem | EVAL($_menv) as $eval_env |
- ($dot + [$eval_env.expr])
- ) | . as $expr | first |
- interpret($expr[1:]; $_menv; _eval_here);
+ {env: $_menv, val: []};
+ . as $dot | $elem | EVAL($dot.env) as $eval_env |
+ ($dot.env | setpath(["atoms"]; $eval_env.env.atoms)) as $_menv |
+ {env: $_menv, val: ($dot.val + [$eval_env.expr])}
+ ) | . as $expr | $expr.val | first |
+ interpret($expr.val[1:]; $expr.env; _eval_here);
def macroexpand(env):
. as $dot |
) //
(
.value | select(.[0].value == "let*") as $value |
- ($currentEnv | pureChildEnv | wrapEnv($replEnv)) as $subenv |
(reduce ($value[1].value | nwise(2)) as $xvalue (
- $subenv;
+ $_menv;
. as $env | $xvalue[1] | EVAL($env) as $expenv |
env_set_($expenv.env; $xvalue[0].value; $expenv.expr))) as $env
| $value[2] | TCOWrap($env; $_retenv; true)
else
$exc|wrap("string")
end) as $exc |
- $value[2].value[2] | EVAL($currentEnv | childEnv([$value[2].value[1].value]; [$exc]) | wrapEnv($replEnv)) as $ex |
+ $value[2].value[2] | EVAL($currentEnv | childEnv([$value[2].value[1].value]; [$exc]) | wrapEnv($replEnv; $_menv.atoms)) as $ex |
$ex.expr | TCOWrap($ex.env; $_retenv; false)
else
error($exc)
| $result.ast
| addEnv($env);
-def PRINT:
- pr_str;
+def PRINT(env):
+ pr_str(env);
def rep(env):
READ | EVAL(env) as $expenv |
if $expenv.expr != null then
- $expenv.expr | PRINT
+ $expenv.expr | PRINT($expenv.env)
else
null
end | addEnv($expenv.env);
function: "eval"
}
} + core_identify),
- dirty_atoms: [],
fallback: null
};
def getEnv:
replEnv
- | wrapEnv
+ | wrapEnv({})
| eval_ign("(def! not (fn* (a) (if a false true)))")
| eval_ign("(def! load-file (fn* (f) (eval (read-string (str \"(do \" (slurp f) \"\\nnil)\")))))))")
| eval_ign("(defmacro! cond (fn* (& xs) (if (> (count xs) 0) (list 'if (first xs) (if (> (count xs) 1) (nth xs 1) (throw \"odd number of forms to cond\")) (cons 'cond (rest (rest xs)))))))")