git » jacl.git » commit 8129c70

misc tightening, more list reader tests

author Alan Dipert
2019-08-29 15:44:14 UTC
committer Alan Dipert
2019-08-29 15:44:14 UTC
parent 83eff617e0ba9864b574607f822ab91b8811cb5e

misc tightening, more list reader tests

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`);