OGURISU Osamu
oguri****@lagen*****
2004年 7月 19日 (月) 17:41:47 JST
小栗栖です。 Gauche-0.8のmake-vectorの挙動なんですが、0.7.3以前で はちゃんと(?) (make-vector 3 0.1) => #(0.1 0.1 0.1) なっていたのが、 (make-vector 3 0.1) => #(#0=0.1 #0# #0#) (make-vector 3 "abc") => #(#0="abc" #0# #0#) (make-vector 3 (list 1 2)) => #(#0=(1 2) #0# #0#) などとなります。さきにvectorを用意しておいて、 vector-fill! でfillしても同様な症状になります。オプ ショナル引数に 0 や #\a #t などを渡すと、ちゃんとそ れらでfillされたvectorが作られます。ちょっと調べてみ たら、0.7.4からこの挙動になったようです。 Scm_MakeVectorのコードを見て気付いたのですが、もし 0.7.3のように (make-vector 3 (list 1 2)) => #((1 2) (1 2) (1 2) となっても、ベクタの各要素は同じScmObj fillへのポイ ンタになるので、それはそれで混乱しそうです。上のベク トルの要素にset-cdr!を使ってみたら、ー斉に変更されて しまいますし。 R5RSにはfillは違うオブジェクトを指すだとか、コピーを 作るだとかの規定はないみたいですね。 どう手をつけてよいか分らないので、報告だけです。。。 -- 小栗栖 修 / OGURISU Osamu