author | Alan Dipert
<alan@dipert.org> 2020-03-24 06:02:54 UTC |
committer | Alan Dipert
<alan@dipert.org> 2020-03-24 06:02:54 UTC |
parent | 727fb7b1de300e7874cda66f985263c2053a3f73 |
jacl.js | +16 | -16 |
diff --git a/jacl.js b/jacl.js index ea16ccd..f96c86d 100644 --- a/jacl.js +++ b/jacl.js @@ -573,40 +573,40 @@ const interpretToken = (token, intern) => { return LispSymbol.createFromString(token, intern); }; -const readList = async stream => { +const listSentinels = new Map([ + ['.', new Object()], + [')', new Object()] +]); - const rdr = new Reader(stream), - sentinels = new Map([ - ['.', new Object()], - [')', new Object()] - ]); +const readList = async stream => { + const rdr = new Reader(stream); let x, car; - x = await rdr.read(true, sentinels); + x = await rdr.read(true, listSentinels); - if (x === sentinels.get('.')) + if (x === listSentinels.get('.')) throw new Error(`Nothing before . in list`); - if (x === sentinels.get(')')) + if (x === listSentinels.get(')')) return new Values(null); car = x; - x = await rdr.read(true, sentinels); + x = await rdr.read(true, listSentinels); - if (x === sentinels.get('.')) { - x = await rdr.read(true, sentinels); - if (x === sentinels.get(')')) + if (x === listSentinels.get('.')) { + x = await rdr.read(true, listSentinels); + if (x === listSentinels.get(')')) throw new Error(`Nothing after . in list`); const cdr = x; - x = await rdr.read(true, sentinels); - if (x === sentinels.get(')')) + x = await rdr.read(true, listSentinels); + if (x === listSentinels.get(')')) return new Values(new Cons(car, cdr)); throw new Error(`More than one object after . in list`); } - if (x === sentinels.get(')')) + if (x === listSentinels.get(')')) return new Values(new Cons(car)); return new Values(new Cons(car, new Cons(x, (await readList(stream))[0])));