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

アーカイブの一覧に戻る

Kimura Fuyuki fuyuk****@hadal*****
2003年 1月 20日 (月) 16:09:55 JST


たびたびすみません。あまりにもバグだらけだったので書き直しました。

あと、put, del から upd!, del!, ins! に変えてみました(ますますSQLみた
いですが。それに引数多すぎ)。

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

(define-method get ((self <dictionary>) key default)
  (define (iteratee end? next ins! del! upd!)
    (cond ((end?) default)
	  (else (cdr (next)))))
  (call-with-iterator self iteratee key))

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

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

(define-method delete! ((self <dictionary>) key)
  (define (iteratee end? next ins! del! upd!)
    (cond ((end?) #f)
	  (else (next) (del!) #t)))
  (call-with-iterator self iteratee key))

あと、こういうことを実際にやるとしたら、get/put! ではなく object-apply 
を使ったほうがいいと思います。理由は次のとおり。

- get/put という名前はほかの意味で使われることが多い
- (ref obj key) は (ref obj slot) とぶつかる

-- 
木村 冬樹




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