2010/08/13

syntax-rules:def-let* (slib)

syntax-rules でマクロを定義するマクロ def-let* がうまいこと動きませんでした。
これがその def-let*
(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

そこで、また教えて頂きました!ありがとうございます!
@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 が開始されるのでここに式を入力してもよいです。

動きましたー!以下そのコード。仕組みがよくわかってませんが。。
(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
view raw def-let*2.scm hosted with ❤ by GitHub

slib は今まで (use slib)(require 'trace) して trace, untrace くらいしか使ったことありませんでした。。slib って R5RS 準拠の pure scheme なライブラリなんですよね?srfi も良いですが、slib も読むと面白そうですね!

プログラミング言語SCHEME

0 件のコメント:

コメントを投稿