2010/08/12

syntax-rules: fluid-let*

なんのことはありません。fluid-let を使って fluid-let* を書くわけですから、let を使って let* を書くのと変わりません。

;; fluid-let*

;; ;; example
;; (define-values (a b c)
;;   (values 1 2 3))

;; (define (a+b+c)
;;   (+ a b c))

;; (a+b+c)
;; ;; 6

;; (fluid-let* ((a 100)
;;              (b (* a 2))
;;              (c (+ a b)))
;;             (a+b+c))
;; ;; 600

つまり、以下のコードのようになります。
;; fluid-let*
;; ;; example
;; (define-values (a b c)
;; (values 1 2 3))
;; (define (a+b+c)
;; (+ a b c))
;; (a+b+c)
;; ;; 6
;; (fluid-let* ((a 100)
;; (b (* a 2))
;; (c (+ a b)))
;; (a+b+c))
;; ;; 600
(define-syntax fluid-let*
(syntax-rules ()
((_ ((var val)) body ...)
(fluid-let ((var val))
body ...))
((_ ((var val) x ...) body ...)
(fluid-let* ((var val))
(fluid-let* (x ...) body ...)))))
(fluid-let* ((a 100)
(b (* a 2))
(c (+ a b)))
(a+b+c))
;; 600
(a+b+c)
;; 6
view raw fluid-let*.scm hosted with ❤ by GitHub

そうなると、こういうのが欲しくなります。(このコードは動かないと思います。)
(define-syntax def-let*
(syntax-rules ()
((_ name let-macro-name)
(define-syntax name
(syntax-rules ()
((_ ((var val)) body ...)
(let-macro-name ((var val))
body ...))
((_ ((var val) x ...) body ...)
(name ((var val))
(name (x ...) body ...))))))))
(def-let* my-fluid-let* fluid-let)
view raw def-let*.scm hosted with ❤ by GitHub

syntax-rules でこういうの書くにはどうしたら良いんだろう。。たぶん、... のところがダメなんじゃないかとは思うのですが・・・。
プログラミングGauche

0 件のコメント:

コメントを投稿