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

アーカイブの一覧に戻る

Kimura Fuyuki fuyuk****@hadal*****
2003年 1月 30日 (木) 12:23:40 JST


At Wed, 29 Jan 2003 00:18:34 -1000 (HST),
Shiro Kawai <shiro****@lava*****> wrote:
> 
> うーんやっぱり難しい問題なのかな。書いててなかなかうまくまとまり
> ません。とりあえず冬樹さんのリストをとっかかりにつらつら書いてみます。

shiroさんがそういうからには難しいんでしょう。:) 私もちょこちょこほかの
言語のイテレータまわりをのぞいてみたのですが、なかなか「これ」というの
がないですね。

実はネタさえ振っておけば「XXX 語ならこんなにかっこよく書けるぜ」みたい
のが出てくるかと思ってたんですが、甘かった…

> そうですね。小黒さんも言われるように、重複を除きたかったら
> callerがdelete-duplicatesを呼ぶだけで良いので、call-with-iterator
> は素直に渡されたkeyを順に処理するので良いかもしれません。
> (それならkeysは可変長引数でなくてリスト渡しの方がいいかなあ)。

私は今のところ「重複を call-with-iterator 側で取り除く必要はない」とい
うほうに傾いています。

ただ、keys の順序を保証するかどうか(必ず与えられた順に繰り返すかどうか)
はまた別の問題だと思います。こっちは無保証にしておいたほうがいい気がし
ています(オブジェクト内部でソートされたキー情報を持っていたりすると、
keys をソートしてから検索を始めたくなるかもしれない)。

> 小黒さんのcall-with-builderを使う案も悪くはないんですが、
> "builder" の名前からしても、オブジェクトでなくクラスを引数に
> 取ることからしても、 "builder" は何も無いところから何かを
> 作るという感じがしてしまいますね。call-with-updater!
> もしくはcall-with-inserter!みたいなものを設けた方がいいかなあ。

builder はたしかに既存のオブジェクトに追加するものではない感じがします。

> > 3. case によるディスパッチはやっぱり格好悪い。
> 
> > 3はかなり一般的な問題だと思うので(gettext.scmでもやっている)、何か適当
> > なユーティリティを提供したほうがいいのかもしれません。
> 
> そうっすねえ。このへんOO言語ならかえって悩まなくても
> いいんでしょうが…
> Gaucheのオブジェクトシステムだとこういうローカルな
> メソッドバインディングは扱いにくいですね。

えっと、これはよく考えないで書いたのであまり気にしないでください。:) 
この場合、case より単純できれいな書き方を考えるのはかなり難しいと思い
ます(dispatching-lambda は一考の価値ありと思いますが)。

> > 4. SRFIとの名前の衝突はどうしたものか(remove!とかmap!とか)。
> 
> > 4は前から気になっていたのですが、無視していました(いい解決を思いつかな
> > いから)。コレクションの fold みたいに再定義する手もありますが、ディク
> > ショナリの場合は関数の意味が違っているのであまりやりたくありません
> > (SRFIは結果を返すが、こっちのは副作用がすべて)。
> 
> dictionary-remove! もしくは dict-remove! ですかね。

前者に一票。識別子が長くなっちゃいますが、まあいいですよね、Scheme だ
し。;) どうしても短いほうがよければ table- とか(やけ気味で) hash- とい
う手もありますが。

なお、後者は RFC 2229 のライブラリを作るときに盛大にかぶるおそれがあり
ます。

> ふと、複数のkeyでインデックスされるディクショナリ、というものも
> 頭をよぎったのですが… あまり複雑にしても仕方無いので置いときましょう。

適当な切り口を見つけるセンスですね。単純すぎても複雑すぎても使い道は減
りますから。

> まとまっていませんが、考えててもすぐには進まなさそうなので、
> とりあえずここまでで。

気長にいきましょう。本当に先例がない世界なのかもしれません。(ODBC の仕
様でものぞいてみようかな…)

-- 
木村 冬樹




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