git » jacl.git » commit 249132f

Add @" syntax for making native strings

author Alan Dipert
2019-09-26 13:33:24 UTC
committer Alan Dipert
2019-09-26 13:33:24 UTC
parent 8b2f22fa95c9f3b52596cdf38c58aeae3e806332

Add @" syntax for making native strings

jacl.js +31 -12

diff --git a/jacl.js b/jacl.js
index 9ba7698..73289d1 100644
--- a/jacl.js
+++ b/jacl.js
@@ -403,24 +403,26 @@ const readList = async stream => {
   return new Values(new Cons(car, (await readList(stream))[0]));
 }
 
+const readString = async stream => {
+  let str = new LispString();
+  for await(const x of stream) {
+    if (x === '"') {
+      return new Values(str);
+    } else if(x === '\\') {
+      str.push(await stream.read());
+    } else {
+      str.push(x);
+    }
+  }
+};
+
 READTABLE.value = new ReadTable()
   .setMacro(';', true, async stream => {
     for await(const ch of stream) {
       if (ch === '\n') return new Values();
     }
   })
-  .setMacro('"', true, async stream => {
-    let str = new LispString();
-    for await(const x of stream) {
-      if (x === '"') {
-        return new Values(str);
-      } else if(x === '\\') {
-        str.push(await stream.read());
-      } else {
-        str.push(x);
-      }
-    }
-  })
+  .setMacro('"', true, readString)
   .setMacro('(', true, readList)
   .setMacro("'", true, async stream => {
     return new Values(Cons.listOf(
@@ -591,6 +593,21 @@ JACLPKG.intern('.').setMacro().fvalue = function(topic, ...ops) {
 };
 JACLPKG.exportSymbol('.');
 
+const readJsString = async stream => {
+  // TODO make this a real JS string reader
+  const [clStr] = await readString(stream);
+  return new Values(clStr.toString());
+};
+
+JACLPKG.intern('ENABLE-JS-SYNTAX').fvalue = () => {
+  READTABLE
+    .val()
+    .makeDispatchMacroChar('@', true)
+    .setDispatchMacroChar('@', '"', readJsString);
+  return null;
+};
+JACLPKG.exportSymbol('ENABLE-JS-SYNTAX');
+
 const isMacroForm = form => {
   return form instanceof Cons
     && form.car
@@ -601,6 +618,8 @@ const isMacroForm = form => {
 const compile = (form, env) => {
   if (form instanceof Number || typeof form === 'number') {
     return form.toString();
+  } else if (form instanceof String || typeof form === 'string') {
+    return JSON.stringify(form);
   } else if (form instanceof LispString) {
     return `(LispString.fromString("${form}"))`;
   } else if (isMacroForm(form)) {