author | Alan Dipert
<alan@dipert.org> 2019-10-19 00:43:09 UTC |
committer | Alan Dipert
<alan@dipert.org> 2019-10-19 00:43:09 UTC |
parent | 09940cc7d644dcbc6ed84aa414b568eeb1868495 |
jacl.js | +24 | -4 |
diff --git a/jacl.js b/jacl.js index 6f9441b..d89cbd7 100644 --- a/jacl.js +++ b/jacl.js @@ -900,10 +900,23 @@ const analyzeSpecials = new Map([ throw new Error(`Can't assign to non-symbol`); if (target.isConstant) throw new Erorr(`Can't set constant`); - const symNode = analyze(env, null, target); - if (symNode.op === 'global') { - } else if (symNode.op === 'local' || symNode.op === 'js-var') { - } + + const svalEnv = env.withContext("sval"); + const targetExpr = analyze(svalEnv, null, target); + const valExpr = analyze(svalEnv, null, val); + + const node = makeNode("set", { + env: env, + parent: parent, + form: form + }); + + targetExpr.parent = valExpr.parent = node; + + node.target = targetExpr; + node.val = valExpr; + + return node; }], [JACLPKG.intern("%TAGBODY"), (env, parent, form) => { const [, ...tagsStmts] = form; @@ -1109,6 +1122,13 @@ const emitNode = (print, node) => { } if (context !== "sval") print(";\n"); break; + case "set": + if (context === "return") print("return "); + emitNode(print, node.target); + print('='); + emitNode(print, node.val); + if (context !== "sval") print(";\n"); + break; case "call": if (context === "return") print("return "); emitNode(print, node.f);