;; 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
つまり、以下のコードのようになります。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;; 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 |
そうなると、こういうのが欲しくなります。(このコードは動かないと思います。)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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) |
syntax-rules でこういうの書くにはどうしたら良いんだろう。。たぶん、... のところがダメなんじゃないかとは思うのですが・・・。
0 件のコメント:
コメントを投稿