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***** ----------------------------------------------------