R6RS の equal? の停止性について
mutable pair のテストを実行していたらネイティブのスタックオーバーフローに。
これはかの有名な循環構造における equal? の停止性問題じゃないですか。
こういうケースはR5RSでは停止しなくても別によいのですが、R6RSでは明確に停止すると決まってる。
(let ((x (list 'a 'b 'c 'a)) (y (list 'a 'b 'c 'a 'b 'c 'a))) (set-cdr! (list-tail x 2) x) (set-cdr! (list-tail y 5) y) (equal? x y))
ちなみにGauche は停止しません。(R5RSだから正しい動作です)
visited なオブジェクトを管理しつつ比較するという実装になるのだろうなと予想し今日はここまで。