author | Alan Dipert
<alan@dipert.org> 2019-09-28 13:33:48 UTC |
committer | Alan Dipert
<alan@dipert.org> 2019-09-28 13:33:48 UTC |
parent | fb0b7b54464c21e159535896fed7ab6c88a0bad9 |
jacl.js | +23 | -8 |
diff --git a/jacl.js b/jacl.js index 6d74edd..90e9c30 100644 --- a/jacl.js +++ b/jacl.js @@ -233,10 +233,24 @@ class Package { } const JACLPKG = Package.makePackage('JACL'); +const JSPKG = Package.makePackage('JS'); Package.makePackage('COMMON-LISP', 'CL'); Package.makePackage('COMMON-LISP-USER', 'CL-USER'); Package.makePackage('KEYWORD'); +const JSVALS = new Map([ + ['+FALSE+', 'false'], + ['+NAN+', 'NaN'], + ['+NULL+', 'null'], + ['+TRUE+', 'true'], + ['+UNDEFINED+', 'undefined'] +]); + +for (const [k,v] of JSVALS) { + JSPKG.intern(k); + JSPKG.exportSymbol(k); +} + const PACKAGE = Package.intern('CL', '*PACKAGE*'); PACKAGE.value = Package.get('JACL'); @@ -560,13 +574,10 @@ class Reader { } } -const JACL_SPECIALS_PKG = Package.makePackage('JACL-SPECIALS'); -JACLPKG.usePackage(JACL_SPECIALS_PKG); - // Special forms related to interop for (const s of ['JS', 'DOT']) { - JACL_SPECIALS_PKG.intern(s); - JACL_SPECIALS_PKG.exportSymbol(s); + JACLPKG.intern(s); + JACLPKG.exportSymbol(s); } // Primitive functions related to interop @@ -607,7 +618,7 @@ JACLPKG.intern('ENABLE-JS-SYNTAX').fvalue = () => { .setDispatchMacroChar('@', '"', readJsString) .setDispatchMacroChar('@', '|', async stream => { return new Values(Cons.listOf( - JACL_SPECIALS_PKG.intern('JS'), + JACLPKG.intern('JS'), await readMultiEscaped(stream, new Token().sawPipe(), true) )); }) @@ -629,6 +640,10 @@ const compile = (form, env) => { return JSON.stringify(form); } else if (form instanceof LispString) { return `(LispString.fromString("${form}"))`; + } else if (form instanceof LispSymbol) { + if (form.packageName === 'JS' && JSVALS.has(form.name)) { + return JSVALS.get(form.name); + } } else if (isMacroForm(form)) { while (isMacroForm(form)) { const [sym, ...args] = form; @@ -638,13 +653,13 @@ const compile = (form, env) => { } else if (form instanceof Cons) { const [op, ...args] = form, [arg1, arg2] = args; - if (JACL_SPECIALS_PKG.intern('JS') === op) { + if (JACLPKG.intern('JS') === op) { if (arg1 instanceof LispSymbol) { return arg1.name; } else { return arg1.toString(); } - } else if (JACL_SPECIALS_PKG.intern('DOT') === op) { + } else if (JACLPKG.intern('DOT') === op) { return `${compile(arg1, env)}.${arg2.name}` } else if (op instanceof LispSymbol) { return `LispSymbol.intern('${op.packageName}', '${op.name}').func()(` +