#gosh> (define x '#0=(#0# - . #0#) )
x
gosh> (car x)
#0=(#0# - . #0#)
gosh> (cadr x)
-
gosh> (cddr x)
#0=(#0# - . #0#)
gosh> (caar x)
#0=(#0# - . #0#)
gosh> (cadar x)
-
gosh> (cddar x)
#0=(#0# - . #0#)
gosh> (caddr x)
#0=(#0# - . #0#)
##n#でカントール集合が定義できるんですね。
##余代数なるものらしいですが,#n#を含む構造の代数的な扱いをするライブラリってありそうですが,あるのかしらん。
#「#n#」っていうのは便宜上の表記にすぎないんで、そこにこだわるのは奇妙な感じがしますが、yamasushiさんが言っているのは要するに自己参照を含む構造の扱いについてですよね。数学的にはどうかわかりませんが、実用上では自己参照を含む構造はeagerな処理系で無限の大きさを持つ構造を扱う手段を与えてくれるという便利さと、扱いを間違えると簡単に無限ループに入るっていう厄介さがありますね。
#特にライブラリってのはないですが、後者についてはR6RSのequal?を巡る話とかはそれなりにおもしろいです。
##n#がおもしろいなーと思うのは,#0=(.......#0#......)の#0#は不動点になってるわけですが,不動点を自分で埋め込めるというのが不思議というか愉快というか。
#フラクタルを描くプログラムを見てもピンとこないまま過ごしてきたのですが,この余代数的表現という語彙をえてストンと腑に落ちました。(30年ごし。
#で,この循環構造を持つデータを定義することと,再帰呼出しをする手続きを書くことは同値のような気がして。循環構造を持つテープを読みながら実行している機械として表現できるんかなーと(受信
#それが停止性の問題というやつかしらん。
#lazyなら何の不思議もないんですが、eagerだと処理系内部でちょっと不透明な操作をしないと(破壊的変更とか)実現できないんでそれが不思議に見えるのかも。