Merge branch 'master' into dom

This commit is contained in:
Danny Yoo 2011-09-08 15:42:23 -04:00
commit a76cc2c262
6 changed files with 44 additions and 18 deletions

View File

@ -48,19 +48,20 @@
this.rest = rest; this.rest = rest;
}; };
var makePair = function (first, rest) {
return new Cons(first, rest);
};
Cons.prototype.reverse = function () { Cons.prototype.reverse = function () {
var lst = this; var lst = this;
var ret = EMPTY; var ret = EMPTY;
while (lst !== EMPTY) { while (lst !== EMPTY) {
ret = Cons.makeInstance(lst.first, ret); ret = makePair(lst.first, ret);
lst = lst.rest; lst = lst.rest;
} }
return ret; return ret;
}; };
Cons.makeInstance = function (first, rest) {
return new Cons(first, rest);
};
// FIXME: can we reduce the recursion on this? // FIXME: can we reduce the recursion on this?
Cons.prototype.equals = function (other, aUnionFind) { Cons.prototype.equals = function (other, aUnionFind) {
@ -82,7 +83,7 @@
var ret = b; var ret = b;
var lst = this.reverse(); var lst = this.reverse();
while (lst !== EMPTY) { while (lst !== EMPTY) {
ret = Cons.makeInstance(lst.first, ret); ret = makePair(lst.first, ret);
lst = lst.rest; lst = lst.rest;
} }
@ -160,19 +161,18 @@
var isEmpty = function (x) { return x === EMPTY; }; var isEmpty = function (x) { return x === EMPTY; };
var makePair = Cons.makeInstance;
var makeList = function () { var makeList = function () {
var result = EMPTY, i; var result = EMPTY, i;
for (i = arguments.length - 1; i >= 0; i--) { for (i = arguments.length - 1; i >= 0; i--) {
result = Cons.makeInstance(arguments[i], result); result = makePair(arguments[i], result);
} }
return result; return result;
}; };
// Coerse a list back into a JavaScript array. // Coerse a list back into a JavaScript array.
var listToArray = function(lst) { var listToArray = function (lst) {
var result = []; var result = [];
while (lst !== EMPTY) { while (lst !== EMPTY) {
result.push(lst.first); result.push(lst.first);
@ -185,14 +185,17 @@
// isList: Any -> Boolean // isList: Any -> Boolean
// Returns true if x is a list (a chain of pairs terminated by EMPTY). // Returns true if x is a list (a chain of pairs terminated by EMPTY).
var isList = function (x) { var isList = function (x) {
while (x !== EMPTY) { var tortoise, hare;
if (x instanceof Cons) { tortoise = hare = x;
x = x.rest; if (hare === EMPTY) { return true; }
} else { while (true) {
return false; if (!(hare instanceof Cons)) { return false; }
} if (tortoise instanceof Cons) { tortoise = tortoise.rest; }
hare = hare.rest;
if (hare instanceof Cons) { hare = hare.rest; }
if (hare === EMPTY) { return true; }
if (tortoise === hare) { return false; }
} }
return true;
}; };

View File

@ -59,7 +59,7 @@
Vector.prototype.toList = function () { Vector.prototype.toList = function () {
var ret = baselib.lists.EMPTY, i; var ret = baselib.lists.EMPTY, i;
for (i = this.length() - 1; i >= 0; 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; return ret;
}; };

View File

@ -2,6 +2,10 @@
("hello" "world") ("hello" "world")
true true
true true
true
false
true
true
false false
true true
hello hello
@ -19,3 +23,4 @@ true
false false
false false
true true
(3 1 4)

View File

@ -3,6 +3,11 @@
'(1 2 3) '(1 2 3)
(list "hello" "world") (list "hello" "world")
(list? empty)
(list? '(1))
(list? '(1 2))
(list? 1)
(empty? empty) (empty? empty)
(empty? '()) (empty? '())
(cons? '()) (cons? '())
@ -24,3 +29,6 @@
(ormap even? '(5)) (ormap even? '(5))
(ormap even? '(1 3 5 7)) (ormap even? '(1 3 5 7))
(ormap even? '(1 3 8 7)) (ormap even? '(1 3 8 7))
(vector->list #(3 1 4))

View File

@ -22,3 +22,5 @@ jill
jane jane
true
false

View File

@ -71,3 +71,11 @@
(newline) (newline)
(for-each displayln (map person-name (person-friends c))) (for-each displayln (map person-name (person-friends c)))
(newline)) (newline))
;; Make sure cyclic lists are treated correctly by list?
(shared ([a (cons 1 a)])
(begin
(displayln (pair? a))
(displayln (list? a))))