author | Alan Dipert
<alan@dipert.org> 2019-10-17 04:54:36 UTC |
committer | Alan Dipert
<alan@dipert.org> 2019-10-17 04:54:36 UTC |
parent | 7aefd8d49af407a8fe8532b5ba02a8483979a320 |
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":