author | Alan Dipert
<alan@dipert.org> 2021-08-06 05:16:50 UTC |
committer | Alan Dipert
<alan@dipert.org> 2021-08-06 05:16:50 UTC |
parent | a0d4fc0802ea28abcf59dfdaf9aaaf7bec668efe |
jacl-tests.lisp | +6 | -0 |
jacl.js | +3 | -3 |
diff --git a/jacl-tests.lisp b/jacl-tests.lisp index 971473d..90bc869 100644 --- a/jacl-tests.lisp +++ b/jacl-tests.lisp @@ -53,6 +53,12 @@ (let ((sym '|Alan|)) (assert= (\. sym |name|) @"Alan")))) +(deftest "Lists" + (with-label "dotted pair" + (let ((pair '(x . 1))) + (assert= (car pair) 'x) + (assert= (cdr pair) 1)))) + (defvar *top-level-special-variable*) (defun top-level-function-referencing-special-variable () diff --git a/jacl.js b/jacl.js index 5023167..7b17c3a 100644 --- a/jacl.js +++ b/jacl.js @@ -693,7 +693,7 @@ const readList = async stream => { const cdr = x; x = await rdr.read(true, listSentinels); if (x === listSentinels.get(')')) - return new ReadValues(new (Cons(car, cdr))); + return new ReadValues(new Cons(car, cdr)); throw new Error(`More than one object after . in list`); } @@ -929,6 +929,8 @@ class Reader { return EOF; } else if (isWhitespace(x)) { continue; + } else if (charSentinels.has(x)) { + return charSentinels.get(x); } else if (macroFun = READTABLE.val().getMacro(x)) { const vals = [...await macroFun(this.stream)]; if (vals.length) { @@ -943,8 +945,6 @@ class Reader { return readMultiEscaped(this.stream, new Token().sawPipe(), internSymbols); } else if (isConstituent(x)) { return readSingleEscaped(this.stream, new Token(x.toUpperCase()), internSymbols); - } else if (charSentinels.has(x)) { - return charSentinels.get(x); } else { throw new Error(`Illegal character: '${x}'`); }