[Gauche-devel-jp] handing keyword in ref

Back to archive index

Masatake YAMATO yamat****@redha*****
2010年 8月 25日 (水) 19:37:49 JST


get-keywordの箇所でrefを使いたくなることが良くあります。
こういったものを書いてみたので良かったら導入を検討してもらえませんか。

大和



(define-method ref ((obj <list>) (keyword <keyword>))
  (get-keyword keyword obj))
(define-method ref ((obj <list>) (keyword <keyword>) fallback)
  (get-keyword keyword obj fallback))
(define-method (setter ref) ((obj <list>) (keyword <keyword>) val)
  (let1 r (memq keyword obj)
    (if r
	(set-cdr! r (cons val (cdr (cdr r))))
	(set-cdr! (last-pair obj) (list keyword val)))))



(use gauche.test)
(test-start "ref keyword")

(define x '(:a 1 :b 2 :c 3))
(test* "ref keyword(0)"
       3
       (ref x :c))
(test* "ref keyword(1)"
       2
       (ref x :b))
(test* "ref keyword(2)"
       1
       (ref x :a))
(test* "ref keyword with default value"
       100
       (ref x :z 100))

(test* "ref+set! for keyword(0)"
       '(:a 1 :b 9 :c 3)
       (begin
	 (set! (ref x :b) 9)
	 x))

(test* "ref+set! for keyword(1)"
       '(:a 7 :b 9 :c 3)
       (begin
	 (set! (ref x :a) 7)
	 x))

(test* "ref+set! for keyword(3)"
       '(:a 7 :b 9 :c 11)
       (begin
	 (set! (ref x :c) 11)
	 x))

(test* "ref+set! for keyword(4)"
       '(:a 7 :b 9 :c 11 :d 13)
       (begin
	 (set! (ref x :d) 13)
	 x))

(test-end)




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