author | Alan Dipert
<alan@dipert.org> 2019-09-28 13:06:35 UTC |
committer | Alan Dipert
<alan@dipert.org> 2019-09-28 13:06:35 UTC |
parent | 249132f0b3195faab12f209ab7cbea378aab36b9 |
jacl.js | +16 | -9 |
diff --git a/jacl.js b/jacl.js index 73289d1..6d74edd 100644 --- a/jacl.js +++ b/jacl.js @@ -232,7 +232,7 @@ class Package { } } -Package.makePackage('JACL'); +const JACLPKG = Package.makePackage('JACL'); Package.makePackage('COMMON-LISP', 'CL'); Package.makePackage('COMMON-LISP-USER', 'CL-USER'); Package.makePackage('KEYWORD'); @@ -560,12 +560,13 @@ class Reader { } } -const JACLPKG = Package.get('JACL', true); +const JACL_SPECIALS_PKG = Package.makePackage('JACL-SPECIALS'); +JACLPKG.usePackage(JACL_SPECIALS_PKG); // Special forms related to interop for (const s of ['JS', 'DOT']) { - JACLPKG.intern(s); - JACLPKG.exportSymbol(s); + JACL_SPECIALS_PKG.intern(s); + JACL_SPECIALS_PKG.exportSymbol(s); } // Primitive functions related to interop @@ -582,10 +583,10 @@ JACLPKG.intern('.').setMacro().fvalue = function(topic, ...ops) { if (arguments.length < 2) throw new Error(`\. requires at least two arguments`); return ops.reduce((prev, op) => { if (op instanceof LispSymbol) { - return Cons.listOf(JACLPKG.intern('DOT'), prev, op); + return Cons.listOf(JACLPKG.findSymbol('DOT')[0], prev, op); } else if (op instanceof Cons) { const [method, ...args] = op; - return Cons.listOf(Cons.listOf(JACLPKG.intern('DOT'), prev, method), ...args); + return Cons.listOf(Cons.listOf(JACLPKG.findSymbol('DOT')[0], prev, method), ...args); } else { throw new Error(`Invalid \. syntax: ${op}`); } @@ -603,7 +604,13 @@ JACLPKG.intern('ENABLE-JS-SYNTAX').fvalue = () => { READTABLE .val() .makeDispatchMacroChar('@', true) - .setDispatchMacroChar('@', '"', readJsString); + .setDispatchMacroChar('@', '"', readJsString) + .setDispatchMacroChar('@', '|', async stream => { + return new Values(Cons.listOf( + JACL_SPECIALS_PKG.intern('JS'), + await readMultiEscaped(stream, new Token().sawPipe(), true) + )); + }) return null; }; JACLPKG.exportSymbol('ENABLE-JS-SYNTAX'); @@ -631,13 +638,13 @@ const compile = (form, env) => { } else if (form instanceof Cons) { const [op, ...args] = form, [arg1, arg2] = args; - if (JACLPKG.intern('JS') === op) { + if (JACL_SPECIALS_PKG.intern('JS') === op) { if (arg1 instanceof LispSymbol) { return arg1.name; } else { return arg1.toString(); } - } else if (JACLPKG.intern('DOT') === op) { + } else if (JACL_SPECIALS_PKG.intern('DOT') === op) { return `${compile(arg1, env)}.${arg2.name}` } else if (op instanceof LispSymbol) { return `LispSymbol.intern('${op.packageName}', '${op.name}').func()(` +