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)