循環リスト
以前も似たようなことではまったのでメモ。
- 循環リストは以下のように破壊的操作によって作成できる。一般的に循環リストを gauche で素朴に印字してはならない。例えば :
gosh> (define x (cons 1 2)) gosh> (set-car! x x) gosh> x #0=(#0# . 2) gosh> (print x) ;; これは止まらずカッコを出力し続ける。注意!!
- 循環リストの表示には、write/ss を使わなくてはならない。
- scheme 処理系によって循環リストの表示は挙動が違う可能性がある点にも注意。またR5RS か R6RS か、にも関係する可能性あり。
- set-car! のような破壊的操作を行う際は注意する。循環リストについてはハッシュ計算時も注意しなくてはならない。 http://d.hatena.ne.jp/cranebird/20080218 参照。そもそも循環リストを与えると止まらない処理は沢山ある、と覚えておく。
- Common Lisp では、スペシャル変数 *PRINT-CIRCLE* があって print に関しては制御できる。http://www.ai.mit.edu/projects/iiip/doc/CommonLISP/HyperSpec/Body/var_stprint-circlest.html 参照。scheme には相当するものは無いようだ。