author | Alan Dipert
<alan@dipert.org> 2019-08-14 17:39:35 UTC |
committer | Alan Dipert
<alan@dipert.org> 2019-08-14 17:39:35 UTC |
parent | ce8c13044f99d4ec6129fcb313f2e9fec2dafb80 |
jacl.js | +24 | -21 |
diff --git a/jacl.js b/jacl.js index 7eb4eda..0f718af 100644 --- a/jacl.js +++ b/jacl.js @@ -208,31 +208,34 @@ class Token extends String { const LIST_CLOSE_PAREN = new Object(); -// TODO broken const readList = async stream => { - let tok = Tokenizer.of(stream), - rdr = Reader.of(tok), - x = await tok.read(); - if (x === LIST_CLOSE_PAREN) { - return new Values(null); - } else if (Token.is(x, '.')) { - throw new Error(`Nothing before . in list`); - } else { - tok.unread(x); - let car = await rdr.read(), - maybeDot = await tok.read(); - if (Token.is(maybeDot, '.')) { - let cons = new Values(new Cons(car, await rdr.read())), - maybeClose = await tok.read(); - if (maybeClose === LIST_CLOSE_PAREN) { - return cons; - } else { - throw new Error(`More than one object after . in list`); - } + const tok = Tokenizer.of(stream), + rdr = Reader.of(tok); + + let t = await tok.read(); + + if (t === LIST_CLOSE_PAREN) return new Values(null); + if (Token.is(t, '.')) throw new Error(`Nothing before . in list`); + + tok.unread(t); + + let car = await rdr.read(), + after = await tok.read(); + + if (Token.is(after, '.')) { + let cons = new Cons(car, await rdr.read()); + if (await tok.read() === LIST_CLOSE_PAREN) { + return new Values(cons); } else { - return new Values(new Cons(car, (await readList(stream))[0])); + throw new Error(`More than one object after . in list`); } } + + if (after === LIST_CLOSE_PAREN) return new Values(new Cons(car)); + + tok.unread(after); + + return new Values(new Cons(car, (await readList(stream))[0])); } READTABLE.value = new ReadTable()