author | Alan Dipert
<alan@dipert.org> 2019-10-18 12:59:43 UTC |
committer | Alan Dipert
<alan@dipert.org> 2019-10-18 12:59:43 UTC |
parent | 9e5f1737c5c7d91d7eed2eae4c3a2d2202f531c5 |
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)); }