From 5bb23733054634b9b898b0a98d9a5989e1ab8ba2 Mon Sep 17 00:00:00 2001 From: Danny Yoo Date: Wed, 7 Sep 2011 19:32:42 -0400 Subject: [PATCH 1/5] fixed isList so it checks for cycles --- js-assembler/runtime-src/baselib-lists.js | 17 ++++++++++------- tests/more-tests/lists.expected | 4 ++++ tests/more-tests/lists.rkt | 5 +++++ tests/more-tests/sharing.expected | 2 ++ tests/more-tests/sharing.rkt | 10 +++++++++- 5 files changed, 30 insertions(+), 8 deletions(-) diff --git a/js-assembler/runtime-src/baselib-lists.js b/js-assembler/runtime-src/baselib-lists.js index a4ad775..b892267 100644 --- a/js-assembler/runtime-src/baselib-lists.js +++ b/js-assembler/runtime-src/baselib-lists.js @@ -172,7 +172,7 @@ // Coerse a list back into a JavaScript array. - var listToArray = function(lst) { + var listToArray = function (lst) { var result = []; while (lst !== EMPTY) { result.push(lst.first); @@ -185,12 +185,15 @@ // isList: Any -> Boolean // Returns true if x is a list (a chain of pairs terminated by EMPTY). var isList = function (x) { - while (x !== EMPTY) { - if (x instanceof Cons) { - x = x.rest; - } else { - return false; - } + var tortoise, hare; + tortoise = hare = x; + while (true) { + if (tortoise instanceof Cons) { tortoise = tortoise.rest; } + if (hare instanceof Cons) { hare = hare.rest; } + if (hare instanceof Cons) { hare = hare.rest; } + if (hare === EMPTY) { return true; } + if (tortoise === hare) { return false; } + if ((hare instanceof Cons) === false) { return false; } } return true; }; diff --git a/tests/more-tests/lists.expected b/tests/more-tests/lists.expected index c859ffb..3d52e80 100644 --- a/tests/more-tests/lists.expected +++ b/tests/more-tests/lists.expected @@ -2,6 +2,10 @@ ("hello" "world") true true +true +false +true +true false true hello diff --git a/tests/more-tests/lists.rkt b/tests/more-tests/lists.rkt index bc49d82..703d4d5 100644 --- a/tests/more-tests/lists.rkt +++ b/tests/more-tests/lists.rkt @@ -3,6 +3,11 @@ '(1 2 3) (list "hello" "world") +(list? empty) +(list? '(1)) +(list? '(1 2)) +(list? 1) + (empty? empty) (empty? '()) (cons? '()) diff --git a/tests/more-tests/sharing.expected b/tests/more-tests/sharing.expected index 8b7c869..bd6f4c7 100644 --- a/tests/more-tests/sharing.expected +++ b/tests/more-tests/sharing.expected @@ -22,3 +22,5 @@ jill jane +true +false diff --git a/tests/more-tests/sharing.rkt b/tests/more-tests/sharing.rkt index 55ebb7a..3a95aa6 100644 --- a/tests/more-tests/sharing.rkt +++ b/tests/more-tests/sharing.rkt @@ -70,4 +70,12 @@ (for-each displayln (map person-name (person-friends b))) (newline) (for-each displayln (map person-name (person-friends c))) - (newline)) \ No newline at end of file + (newline)) + + + +;; Make sure cyclic lists are treated correctly by list? +(shared ([a (cons 1 a)]) + (begin + (displayln (pair? a)) + (displayln (list? a)))) \ No newline at end of file From 14da75b1648e61ad95383b8d2962c558ea8593b8 Mon Sep 17 00:00:00 2001 From: Danny Yoo Date: Wed, 7 Sep 2011 19:51:06 -0400 Subject: [PATCH 2/5] reworking the logic to remove a test --- js-assembler/runtime-src/baselib-lists.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/js-assembler/runtime-src/baselib-lists.js b/js-assembler/runtime-src/baselib-lists.js index b892267..6a72155 100644 --- a/js-assembler/runtime-src/baselib-lists.js +++ b/js-assembler/runtime-src/baselib-lists.js @@ -52,13 +52,13 @@ var lst = this; var ret = EMPTY; while (lst !== EMPTY) { - ret = Cons.makeInstance(lst.first, ret); + ret = makePair(lst.first, ret); lst = lst.rest; } return ret; }; - Cons.makeInstance = function (first, rest) { + var makePair = function (first, rest) { return new Cons(first, rest); }; @@ -82,7 +82,7 @@ var ret = b; var lst = this.reverse(); while (lst !== EMPTY) { - ret = Cons.makeInstance(lst.first, ret); + ret = makePair(lst.first, ret); lst = lst.rest; } @@ -160,12 +160,11 @@ var isEmpty = function (x) { return x === EMPTY; }; - var makePair = Cons.makeInstance; var makeList = function () { var result = EMPTY, i; for (i = arguments.length - 1; i >= 0; i--) { - result = Cons.makeInstance(arguments[i], result); + result = makePair(arguments[i], result); } return result; }; @@ -187,13 +186,14 @@ var isList = function (x) { var tortoise, hare; tortoise = hare = x; + if (hare === EMPTY) { return true; } while (true) { + if (!(hare instanceof Cons)) { return false; } if (tortoise instanceof Cons) { tortoise = tortoise.rest; } - if (hare instanceof Cons) { hare = hare.rest; } + hare = hare.rest; if (hare instanceof Cons) { hare = hare.rest; } if (hare === EMPTY) { return true; } if (tortoise === hare) { return false; } - if ((hare instanceof Cons) === false) { return false; } } return true; }; From 9161ebc6b7488905f7a135f7a0c48a24bae2e9bb Mon Sep 17 00:00:00 2001 From: Danny Yoo Date: Wed, 7 Sep 2011 19:53:03 -0400 Subject: [PATCH 3/5] jslinting --- js-assembler/runtime-src/baselib-lists.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/js-assembler/runtime-src/baselib-lists.js b/js-assembler/runtime-src/baselib-lists.js index 6a72155..4df1e7e 100644 --- a/js-assembler/runtime-src/baselib-lists.js +++ b/js-assembler/runtime-src/baselib-lists.js @@ -48,6 +48,10 @@ this.rest = rest; }; + var makePair = function (first, rest) { + return new Cons(first, rest); + }; + Cons.prototype.reverse = function () { var lst = this; var ret = EMPTY; @@ -58,9 +62,6 @@ return ret; }; - var makePair = function (first, rest) { - return new Cons(first, rest); - }; // FIXME: can we reduce the recursion on this? Cons.prototype.equals = function (other, aUnionFind) { @@ -195,7 +196,6 @@ if (hare === EMPTY) { return true; } if (tortoise === hare) { return false; } } - return true; }; From 2316307901f57901ee6981c47fafe0e4846f3dcb Mon Sep 17 00:00:00 2001 From: Danny Yoo Date: Wed, 7 Sep 2011 19:53:49 -0400 Subject: [PATCH 4/5] removing incorrect call --- js-assembler/runtime-src/baselib-vectors.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js-assembler/runtime-src/baselib-vectors.js b/js-assembler/runtime-src/baselib-vectors.js index b7daaa9..b3cc0ea 100644 --- a/js-assembler/runtime-src/baselib-vectors.js +++ b/js-assembler/runtime-src/baselib-vectors.js @@ -59,7 +59,7 @@ Vector.prototype.toList = function () { var ret = baselib.lists.EMPTY, i; for (i = this.length() - 1; i >= 0; i--) { - ret = baselib.lists.Cons.makeInstance(this.elts[i], ret); + ret = baselib.lists.makePair(this.elts[i], ret); } return ret; }; From 418943d8ec4abcee2f484a44334a4493cb586102 Mon Sep 17 00:00:00 2001 From: Danny Yoo Date: Wed, 7 Sep 2011 19:59:38 -0400 Subject: [PATCH 5/5] small test --- tests/more-tests/lists.expected | 1 + tests/more-tests/lists.rkt | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/more-tests/lists.expected b/tests/more-tests/lists.expected index 3d52e80..296e538 100644 --- a/tests/more-tests/lists.expected +++ b/tests/more-tests/lists.expected @@ -23,3 +23,4 @@ true false false true +(3 1 4) diff --git a/tests/more-tests/lists.rkt b/tests/more-tests/lists.rkt index 703d4d5..fc56698 100644 --- a/tests/more-tests/lists.rkt +++ b/tests/more-tests/lists.rkt @@ -28,4 +28,7 @@ (ormap even? '(2 4 5 8)) (ormap even? '(5)) (ormap even? '(1 3 5 7)) -(ormap even? '(1 3 8 7)) \ No newline at end of file +(ormap even? '(1 3 8 7)) + + +(vector->list #(3 1 4))