git » jacl.git » commit a4eaac2

Add JS: package and primitive values

author Alan Dipert
2019-09-28 13:33:48 UTC
committer Alan Dipert
2019-09-28 13:33:48 UTC
parent fb0b7b54464c21e159535896fed7ab6c88a0bad9

Add JS: package and primitive values

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