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;
};
var makePair = function (first, rest) {
return new Cons(first, rest);
};
Cons.prototype.reverse = function () {
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) {
return new Cons(first, rest);
};
// FIXME: can we reduce the recursion on this?
Cons.prototype.equals = function (other, aUnionFind) {
@ -82,7 +83,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,19 +161,18 @@
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;
};
// 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,14 +185,17 @@
// 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;
if (hare === EMPTY) { return true; }
while (true) {
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 () {
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;
};

View File

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

View File

@ -3,6 +3,11 @@
'(1 2 3)
(list "hello" "world")
(list? empty)
(list? '(1))
(list? '(1 2))
(list? 1)
(empty? empty)
(empty? '())
(cons? '())
@ -23,4 +28,7 @@
(ormap even? '(2 4 5 8))
(ormap even? '(5))
(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
true
false

View File

@ -70,4 +70,12 @@
(for-each displayln (map person-name (person-friends b)))
(newline)
(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))))