[Gauche-devel-jp] Re: listを作る関数

アーカイブの一覧に戻る

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 バイト
説明:       無し
ダウンロード 


Gauche-devel-jp メーリングリストの案内
アーカイブの一覧に戻る