#(write (letrec ((x (lcons 0 x))) x)) すると返ってこないんですが、これってやっちゃ駄目なんですか?
#(letrec ((x (lcons 0 x))) (eq? x (cdr x))) ; => #f これ意外でした
#lconsって単に(delay (cons a b)) ではなくて、ストリームのnextが毎回新しいconsを産み出すジェネレータになるので、ストリームのspineは循環しないです。
#なるほど、先にジェネレータにしてしまうんですね。納得です。
#gosh> (macroexpand '(lcons 0 1))
(#<identifier gauche.internal#%lcons.1e3c080> 0 (lambda () 1))
gosh> (with-module gauche.internal %lcons)
#<closure (%lcons item thunk)>