Shiro Kawai
shiro****@lava*****
2005年 3月 17日 (木) 05:25:03 JST
From: 福田洋一 <yfuku****@tibet*****> Subject: [Gauche-devel-jp] listを作る関数 Date: Wed, 16 Mar 2005 23:34:16 +0900 > ((a b c) (a b c) (a b c) (a b c) (a b c)) > とならず、 > (#0=(a b c) #0# #0# #0# #0#) > となってしまいます。 > > これは一体何を意味しているのでしょうか。どこかに間違えがあるのでしょうか 間違いはないので安心して下さい。 こういう表記になるのは、Gaucheの対話環境が「共有構造を明示する」表示を 行っているためです。 ためしに (write (my-make-list 5 '(a b c))) のように結果をwriteで表示させれば ((a b c) (a b c) (a b c) (a b c) (a b c)) が印字されます。 (対話環境ではこの後にwriteの戻り値#<undef>が出ますが) #0= という表記はその次に来るS式にラベルをつけるもので、#0#で ラベルのついたS式そのものを参照します。 正確な定義はsrfi-38 http://srfi.schemers.org/srfi-38/srfi-38.html にあります。 (#0=(a b c) #0# #0# #0# #0#) という表記は、外側のリストの各要素が全く同一の("eq?"な)オブジェクトを 指していることを示しています。図を添付したので参考にして下さい。 共有構造を気にする必要は、最初のうちはあまり無いと思います。 循環する構造を表示させようとした場合、普通のwriteでは表示が 止まらなくなってしまうため、Gaucheではデフォルトで共有構造を 明示するようにしました。 この表示がうるさい場合は、goshのプロンプトで (read-eval-print-loop #f #f (lambda vals (for-each (lambda (v) (write v) (newline)) vals))) を実行すれば、ただのwriteを使う対話環境が走ります。 --shiro -------------- next part -------------- テキスト形式以外の添付ファイルを保管しました... ファイル名: lis.gif 型: image/gif サイズ: 3772 バイト 説明: 無し Télécharger