syntax-rules でマクロを定義するマクロ def-let* がうまいこと動きませんでした。
これがその def-let*
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) |
そこで、また教えて頂きました!ありがとうございます!
@valvallow http://bit.ly/9Bvqri
@valvallow まず (use slib)(require 'repl)(require 'syntax-case) とします。 slib 環境内で評価したい式全体を quote して macro:eval 手続きに渡せばよいです。
@valvallow あるいは、 (repl:top-level macro:eval) とすると slib の repl が開始されるのでここに式を入力してもよいです。
動きましたー!以下そのコード。仕組みがよくわかってませんが。。
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
(use slib) | |
(require 'repl) | |
(require 'syntax-case) | |
(macro:eval '(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 (... ...)))))))))) | |
(define a 1) | |
(define b 2) | |
(define c 3) | |
(define (a+b+c) | |
(+ a b c)) | |
(macro:eval '(def-let* my-fluid-let* fluid-let)) | |
(macro:eval '(begin | |
(my-fluid-let* ((a 100)(b 200)(c (+ a b))) | |
(print (a+b+c))) | |
(print (a+b+c)))) | |
;; 600 | |
;; 6 |
slib は今まで (use slib)(require 'trace) して trace, untrace くらいしか使ったことありませんでした。。slib って R5RS 準拠の pure scheme なライブラリなんですよね?srfi も良いですが、slib も読むと面白そうですね!
0 件のコメント:
コメントを投稿