[Gauche-devel-jp] remove! in SRFI-1

アーカイブの一覧に戻る

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






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