私も読みましたが、詳細はすでに記憶の彼方です。。再読したいところです。
記憶に残っている dlambda を scheme の syntax-rules で書いてみました。たぶん同じように動くと思います。
マクロを書く前に・・・
;; image
(define count-test
(let ((count 0))
(dlambda
(:reset ()(set! count 0))
(:inc (n)(inc! count n))
(:dec (n)(dec! count n))
(:bound (lo hi)
(set! count (min hi (max lo count)))))))
;; expand image
(define count-test
(let ((count 0))
(lambda (key . args)
(case key
((:reset)(apply (lambda ()
(set! count 0)) args))
((:inc)(apply (lambda (n)
(inc! count n)) args))
((:dec)(apply (lambda (n)
(dec! count n)) args))
((:bound)(apply (lambda (lo hi)
(set! count
(min hi (max lo count)))) args))
(else key)))))
(count-test :reset)
;; 0
(count-test :inc 100)
;; 100
(count-test :inc 1)
;; 101
(count-test :inc 2)
;; 102
(count-test :bound -10 10)
;; 10
(count-test :reset)
;; 0
(count-test :inc 1)
;; 1以下マクロのコード
0 件のコメント:
コメントを投稿