git » jacl.git » commit 4aff94c

wip %SET

author Alan Dipert
2019-10-19 00:43:09 UTC
committer Alan Dipert
2019-10-19 00:43:09 UTC
parent 09940cc7d644dcbc6ed84aa414b568eeb1868495

wip %SET

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);