author | Alan Dipert
<alan@dipert.org> 2019-10-09 14:20:43 UTC |
committer | Alan Dipert
<alan@dipert.org> 2019-10-09 14:20:43 UTC |
parent | ab173ffec7c67bc47fdd23c3758a5436efb62fe9 |
jacl.js | +21 | -16 |
diff --git a/jacl.js b/jacl.js index 0691e55..becca80 100644 --- a/jacl.js +++ b/jacl.js @@ -694,7 +694,7 @@ const assoc = (...objs) => Object.assign({}, ...objs); //(def specials '#{if def fn* do let* loop recur new set! ns}) -const specials = new Map([ +const analyzeSpecials = new Map([ [JACLPKG.intern("%CALL"), (env, form) => { }] ]); @@ -717,8 +717,8 @@ const analyzeList = (env, form) => { form = sym.func()(...args); } return analyze(env, form); - } else if (specials.has(form.car)) { - return specials.get(form.car)(env, form); + } else if (analyzeSpecials.has(form.car)) { + return analyzeSpecials.get(form.car)(env, form); } else if (isLambdaForm(form) || form.car instanceof LispSymbol) { return parseCall(env, form); } else { @@ -727,18 +727,21 @@ const analyzeList = (env, form) => { }; const analyzeSymbol = (env, form) => { - const ret = (x) => assoc({ env: env, form: form }, x); - if (env.context === "fexpr") { - if (env.flocals.has(form)) { - return ret({ op: "local", name: env.flocals.get(form) }); - } else { - return ret({ op: "symfunc" }); - } - } else if (env.context === "expr") { - if (env.vlocals.has(form)) { - return ret({ op: "local", name: env.get('vlocals').get(form) }); + if (env.context === "fexpr" || env.context === "expr") { + if (env.locals[env.context].has(form)) { + return { + op: "local", + env: env, + form: form, + name: env.locals[env.context].get(form) + }; } else { - return ret({ op: "symval" }); + return { + op: "sym", + ctx: env.context, + env: env, + form: form, + }; } } else { throw new Error(`Unknown context: ${env.context}`); @@ -746,8 +749,10 @@ const analyzeSymbol = (env, form) => { }; const emptyEnv = { - vlocals: new Map(), - flocals: new Map(), + locals: { + fexpr: new Map(), + expr: new Map() + }, context: "expr" };