author | Alan Dipert
<alan@dipert.org> 2019-08-29 15:44:14 UTC |
committer | Alan Dipert
<alan@dipert.org> 2019-08-29 15:44:14 UTC |
parent | 83eff617e0ba9864b574607f822ab91b8811cb5e |
jacl-tests.js | +4 | -0 |
jacl.js | +5 | -11 |
diff --git a/jacl-tests.js b/jacl-tests.js index b7dffe1..8c0543d 100644 --- a/jacl-tests.js +++ b/jacl-tests.js @@ -109,4 +109,8 @@ QUnit.test('Conses', async is => { cons = await read1('(1 (2 . 3) 4)'); is.deepEqual(Array.from(cons), [1,[2,3],4], 'convert to nested array'); + + cons = await read1('((((x . y))))'); + is.strictEqual(cons.car.car.car.car.name, 'X', 'very deep pair'); + is.strictEqual(cons.car.car.car.cdr.name, 'Y', 'very deep pair'); }); diff --git a/jacl.js b/jacl.js index bd5ec01..4744305 100644 --- a/jacl.js +++ b/jacl.js @@ -240,6 +240,7 @@ const skipWhitespace = async stream => { }; const dotIsNext = async stream => { + await skipWhitespace(stream); const x = await stream.read(); if (x !== '.') { @@ -257,21 +258,17 @@ const dotIsNext = async stream => { }; const closeParenIsNext = async stream => { + await skipWhitespace(stream); const x = await stream.read(); - if (x === ')') { - return true; - } else { - stream.unread(x); - return false; - } + if (x === ')') return true; + stream.unread(x); + return false; }; const readList = async stream => { const rdr = new Reader(stream); - await skipWhitespace(stream); - if (await dotIsNext(stream)) throw new Error(`Nothing before . in list`); @@ -280,14 +277,11 @@ const readList = async stream => { const car = await rdr.read(); - await skipWhitespace(stream); - if (await dotIsNext(stream)) { await skipWhitespace(stream); if (await closeParenIsNext(stream)) throw new Error(`Nothing after . in list`); const cdr = await rdr.read(); - await skipWhitespace(stream); if (await closeParenIsNext(stream)) return new Values(new Cons(car, cdr)); throw new Error(`More than one object after . in list`);