Gauche > Archives > 2013/10/08

2013/10/08 04:33:23 UTC®
#
filter!の動きが怪しい気がするのですが・・・
#
(define *list* '(2 3 4 5))
#
(define *list* '(2 2 3 4 5))
(display (filter! odd? l))
(display l)
#
を流すと(3 3)(2 2 3 5)になるんですよね・・・
#
↑訂正: (3 5)(2 2 3 5) です
#
自分の認識だと (3 5)(3 5)ni
#
ni
#
になるのかなーっと思っているのですが
2013/10/08 05:23:01 UTCshiro
#
filter!は与えられたリストの一部を再利用する可能性があるっていうだけで、*list*の束縛とは何の関係もありません。
#
リンクリストの絵を書いてみればわかると思いますが、*list* -> 2 -> 2-> 3 -> 4 -> 5 っていうリストの 3 -> 4 -> 5 の部分が変更されて 3 -> 5 になってfilter!から変えされるのだけれど、*list* が指してる 2 -> 2 -> 3 ... ってセルはそのままです。
#
s/変えされる/返される/
2013/10/08 05:25:44 UTC®
#
実装をみるかぎりodd?の場合リスト内の最初の奇数までリストの更新を行わないみたいでしたのでもしやと思っていましたがそういうことでしたか。
#
ありがとうございます
2013/10/08 05:26:22 UTCshiro
#
そもそもSchemeは値渡しなので、filter!という関数が「引数に渡した変数の束縛」を変えることはできません。
2013/10/08 05:32:34 UTC®
#
勉強になりました。ご指摘ありがとうございました。