git » jacl.git » commit bb8491f

list reading working

author Alan Dipert
2019-08-14 17:39:35 UTC
committer Alan Dipert
2019-08-14 17:39:35 UTC
parent ce8c13044f99d4ec6129fcb313f2e9fec2dafb80

list reading working

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()