git » jacl.git » commit 488651d

quasiquote is closer

author Alan Dipert
2019-10-18 12:59:43 UTC
committer Alan Dipert
2019-10-18 12:59:43 UTC
parent 9e5f1737c5c7d91d7eed2eae4c3a2d2202f531c5

quasiquote is closer

jacl.js +8 -8

diff --git a/jacl.js b/jacl.js
index f7e1dd4..3dabc5d 100644
--- a/jacl.js
+++ b/jacl.js
@@ -727,15 +727,14 @@ CLPKG.intern('QUOTE').setMacro().fvalue = function(env, form, x) {
   return Cons.listOf(JACLPKG.intern('%QUOTE'), x);
 };
 
-JACLPKG.intern('UNQUOTE').setMacro().fvalue = function(env, form) {
+JACLPKG.intern('UNQUOTE').setMacro().fvalue = 
+JACLPKG.intern('UNQUOTE-SPLICING').setMacro().fvalue = function(env, form) {
   throw new Error(`Comma not inside backquote`);
 };
 
 JACLPKG.intern('QUASIQUOTE').setMacro().fvalue = function(env, form) {
 
-  const callCL = (funcName, ...args) => {
-    return Cons.listOf(CLPKG.intern(funcName), ...args);
-  };
+  const callCL = (funcName, ...args) => Cons.listOf(CLPKG.intern(funcName), ...args); ;
 
   const transform = (form, wrapInList = true) => {
     const maybeWrap = x => wrapInList ? callCL('LIST', x) : x;
@@ -750,12 +749,13 @@ JACLPKG.intern('QUASIQUOTE').setMacro().fvalue = function(env, form) {
 
   const transformCompound = compound => {
     const rec = object => {
-      if (object instanceof Cons && JACLPKG.intern('UNQUOTE') === object.car) {
+      if (object instanceof Cons && 
+        (!(object.cdr instanceof Cons) ||
+         (object.cdr instanceof Cons && JACLPKG.intern('UNQUOTE') === object.cdr.car))) {
         return Cons.listOf(transform(object.car), transform(object.cdr, false));
-      } else if (object instanceof Cons && JACLPKG.intern('UNQUOTE-SPLICING') === object.car) {
+      } else if (object instanceof Cons &&
+        (object.cdr instanceof Cons && JACLPKG.intern('UNQUOTE-SPLICING') === object.cdr.car)) {
         throw new Error(`UNQUOTE-SPLICING in dotted list`);
-      } else if (object === null) {
-        return null;
       } else {
         return new Cons(transform(object.car), rec(object.cdr));
       }