之前从1.3甚至更早开始,就发现tinyscheme运行yinyang pluzzle的时候,是有bug的。
(let* ((yin
((lambda (cc) (display #@) cc) (call-with-current-continuation (lambda (c) c))))
(yang
((lambda (cc) (display #*) cc) (call-with-current-continuation (lambda (c) c)))))
(yin yang))
本来是一个无限的过程,但是很快就结束了。
但因为本来只是业余玩这个,加上之前觉得找这种bug工作量比较大,一直没找。后来觉得这么小的scheme解释器实在是少,而且恰好有时间,还是解决了这个bug比较好。
于是去年下功夫找了下,改了这个bug。后来事情多了,又把修改的地方丢一边去了,但是还好修改过的版本一直放在网盘。
今天对比了下,找到当时改掉的bug。
是因为里面使用的将list顺序翻转的函数有2个,其中一个用起来有bug。
/* reverse list -- produce new list */
static pointer reverse(scheme *sc, pointer a) {
/* a must be checked by gc */
pointer p = sc->NIL;
for (; is_pair(a); a = cdr(a)) {
p = cons(sc, car(a), p);
}
return (p);
}
/* reverse list --- in-place */
static pointer reverse_in_place(scheme *sc, pointer term, pointer list) {
pointer p = list, result = term, q;
while (p != sc->NIL) {
q = cdr(p);
cdr(p) = result;
result = p;
p = q;
}
return (result);
}
前面的reverse会生成新的list,后面的reverse_in_place则不会。将几个使用reverse_in_place的地方改成reverse就好了。

Source: xundaoinfo