git » jacl.git » commit ed55d09

add cl:quote

author Alan Dipert
2019-10-17 04:54:36 UTC
committer Alan Dipert
2019-10-17 04:54:36 UTC
parent 7aefd8d49af407a8fe8532b5ba02a8483979a320

add cl:quote

jacl.js +12 -10

diff --git a/jacl.js b/jacl.js
index 7e2745b..b506c73 100644
--- a/jacl.js
+++ b/jacl.js
@@ -661,6 +661,10 @@ JACLPKG.intern('.').setMacro().fvalue = function(topic, ...ops) {
 };
 JACLPKG.exportSymbol('.');
 
+CLPKG.intern('QUOTE').setMacro().fvalue = function(x) {
+  return Cons.listOf(JACLPKG.intern('%QUOTE'), x);
+};
+
 const readJsString = async stream => {
   // TODO make this a real JS string reader
   const [clStr] = await readString(stream);
@@ -722,13 +726,7 @@ const isTag = x => x instanceof LispSymbol
 const asTagName = x => x instanceof LispSymbol ? x.name : x.valueOf();
 const analyzeSpecials = new Map([
   [JACLPKG.intern("%QUOTE"), (env, parent, form) => {
-    const [, val] = form
-    return makeNode("constant", { 
-      env: env, 
-      parent: parent, 
-      form: form,
-      val: val
-    });
+    return makeNode("quote", { env: env, parent: parent, form: form });
   }],
   [JACLPKG.intern("%DOT"), (env, parent, form) => {
     const [, target, field] = form;
@@ -867,7 +865,6 @@ const analyzeSymbol = (env, parent, form) => {
   const node = makeNode(null, { env: env, parent: parent, form: form });
   if (form.packageName === 'KEYWORD') {
     node.op = "constant";
-    node.val = form;
   } else if (form.packageName === 'JS' && !form.getPackage().isExported(form.name)) {
     // TODO Explode if the name isn't a valid JS identifier
     node.op = "js-var";
@@ -919,7 +916,7 @@ const analyze = (env, parent, form) => {
   } else if (form instanceof Cons) {
     return analyzeList(env, parent, form);
   } else {
-    return makeNode("constant", { env: env, parent: parent, form: form, val: form });
+    return makeNode("constant", { env: env, parent: parent, form: form });
   }
 };
 
@@ -960,9 +957,14 @@ const emitNode = (print, node) => {
       print(`.${node.field}`);
       if (context !== "sval") print(";\n");
       break;
+    case "quote":
+      if (context === "return") print("return ");
+      print(constantCode(form.cdr.car));
+      if (context !== "sval") print(";\n");
+      break;
     case "constant":
       if (context === "return") print("return ");
-      print(constantCode(node.val));
+      print(constantCode(form));
       if (context !== "sval") print(";\n");
       break;
     case "local":