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

アーカイブの一覧に戻る

Kimura Fuyuki fuyuk****@hadal*****
2003年 1月 20日 (月) 10:32:02 JST


少しイメージが固まってきたので追加。

次のようなイテレータ構築メソッドを仮定します。

Generic function: call-with-iterator dictionary proc keys...

コレクションの call-with-iterator との違いは、

- keys に指定されたキーを持つ要素について繰り返す(無指定なら全要素)

- proc は4個の引数を取る。
  最初の2個はコレクションのものと同じで、
  あとの2個は小黒さんのメールにある put, del と同じ。

これで get, put!, exists?, delete! の4点セットを書いてみます。

(define-method get ((self <dictionary>) key)
  (define (iteratee end? next put del)
    (when (end?) (error "dictionary doesn't have an entry for key" key))
    (cdr (next)))
  (call-with-iterator self iteratee key))

(define-method get ((self <dictionary>) key default)
  (define (iteratee end? next put del)
    (if (end?) default (cdr (next))))
  (call-with-iterator self iteratee key))

(define-method put! ((self <dictionary>) key val)
  (define (iteratee end? next put del)
    (unless (end?) (put val)))
  (call-with-iterator self iteratee key))

(define-method exists? ((self <dictionary>) key)
  (define (iteratee end? next put del)
    (not (end?)))
  (call-with-iterator self iteratee key))

(define-method delete! ((self <dictionary>) key)
  (define (iteratee end? next put del)
    (unless (end?) (del val)))
  (call-with-iterator self iteratee key))

どんなもんでしょうね?

-- 
木村 冬樹




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