git » jacl.git » commit fb0b7b5

stuff

author Alan Dipert
2019-09-28 13:06:35 UTC
committer Alan Dipert
2019-09-28 13:06:35 UTC
parent 249132f0b3195faab12f209ab7cbea378aab36b9

stuff

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()(` +