[Gauche-devel-jp] 辞書とイテレータ

Back to archive index

KOGURO Naoki naoki****@kogur*****
2003年 1月 21日 (火) 00:49:57 JST


小黒です。

At Sun, 19 Jan 2003 22:42:24 -1000 (HST),
Shiro Kawai wrote:
> というわけで、こんなのはいかが。
> 
>    call-with-iterator (dict <dictionary>) iteratee seed keys ...
> 
> で、iterateeは次のように呼ばれる:
> 
>    iteratee cursor seed
> 
> ここでcursorはprocedureであり、次のような動作をする:
> 
>    (cursor 'get)        現在のキーと値を返す。
>    (cursor 'next seed) 次にキーとマッチするエントリがあれば、
>                         iteratteeを呼び出す。その際にseedを
>                         第2引数として渡す。もうマッチするエントリが
>                         無ければseedがcall-with-iteratorの
>                         戻り値となる。
>    (cursor 'update! value) 現在のエントリの値を変更。
>    (cursor 'delete!)    現在のエントリを削除。
>    (cursor 'insert! key value)   key value ペアを辞書に追加。
>                         但し、実際の追加はcall-with-iterator
>                         を抜ける直前に行われる。追加されたエントリ
>                         に対してiterateeが呼ばれることはない。
> 
> seedは最初にiterateeが呼ばれる時はcall-with-iteratorの受け取った
> seedで、2回目以降は cursor 'next メソッドに渡された値。
> 
> cursorの呼び出しはcall-with-iteratorのdynamic extent内のみで
> 有効とする。

確かに、この手の更新がかけられる外部 iterator を実装するのは面倒ですよ
ね。

で、この cursor はどれだけ robust に作られるべきなのでしょうか。例えば、
以下の場合の動作はどうすべきでしょう? 
(1) (cursor 'delete) を呼んだあとの (cursor 'get), (cursor 'update
value), (cursor 'delete)
(2) (cursor 'update value) を呼んだあとの (cursor 'get)
(3) call-with-iterator の iteratee で、同じ dictionary に対して
call-with-iterator を呼んだとき。 (内の iteratee で更新をかけてしまっ
たときに外の iteratee からはどう見えるべきなのか?)

不定にしてしまうのが一番楽ですが、(2) あたりはもしかしたら使いたいかも。

----------------------------------------------------
 小黒 直樹 (KOGURO, Naoki)
 E-mail: naoki****@kogur***** / kogur****@dd*****
----------------------------------------------------



Gauche-devel-jp メーリングリストの案内
Back to archive index