Shiro Kawai
shiro****@lava*****
2003年 1月 14日 (火) 19:13:57 JST
remove! はリストを破壊的に変更することが「許されている」という だけですので、変更されたリストを確実に得るにはremove!の戻り値を 使わなければなりません。つまり、次のようにしてやる必要があります。 gosh> (set! foo (remove! (lambda (x) (eq? x 'a)) foo)) (c d) なぜGaucheがこのような動作になっているかは、リストのポインタ表現 を考えて頂ければわかりやすいと思います。 +--+--+ +--+--+ +--+--+ foo -->| | ----->| | ----->| | ----->nil +-|+--+ _ +-|+--+ +-|+--+ | /| | | v / v v a / c d | | (remove! (lambda (x) (eq? x 'a) foo)) は ここのポインタを返す。 remove!が受け取るのはfooが指しているセルであり、 「変数foo」ではないので、取り除いたからといって「変数foo」自身の 値を変えることはできないのです。 --shiro