Scheme 是否有可能实施;定义宏“;麻省理工学院计划
看完之后。我发现很难记住如何使用Scheme 是否有可能实施;定义宏“;麻省理工学院计划,scheme,mit-scheme,Scheme,Mit Scheme,看完之后。我发现很难记住如何使用define syntax来代替define macro,所以我想在mit scheme中实现define macro(或者至少找到一些等价物) 以下是我的(有问题的)实现: (define-syntax define-macro (rsc-macro-transformer (let ((xfmr (lambda (macro-name macro-body) (list 'define-syntax macro-name
define syntax
来代替define macro
,所以我想在mit scheme中实现define macro
(或者至少找到一些等价物)
以下是我的(有问题的)实现:
(define-syntax define-macro
(rsc-macro-transformer
(let ((xfmr (lambda (macro-name macro-body)
(list 'define-syntax macro-name
(list 'rsc-macro-transformer
(let ((m-xfmr macro-body))
(lambda (e r)
(apply m-xfmr (cdr e)))))))))
(lambda (e r)
(apply xfmr (cdr e))))))
(define-macro my-when
(lambda (test . branch)
(list 'if test (cons 'begin branch))))
(my-when #t
(begin
(display "True")
(newline)))
而REPL抱怨说:
;The object (lambda (test . branch) (list (quote if) test (cons (quote begin) branch))) is not applicable.
我是scheme新手,不知道出了什么问题,有人能帮我吗?首先,你应该学会使用准旋转,这样你的宏更容易阅读。像这样:
(define-macro (my-when test . branch)
`(if ,test
(begin ,@branch)))
不过,更严重的是,使用语法规则编写这篇文章相当容易,您确实应该更喜欢它而不是定义宏
(define-syntax-rule (my-when test branch ...)
(if test
(begin branch ...)))
哦,您以前没有看过定义语法规则
?这是一个简单的宏,可用于编写一个子句define syntax
宏,其定义如下:
(define-syntax define-syntax-rule
(syntax-rules ()
((define-syntax-rule (name . pattern) template)
(define-syntax name
(syntax-rules ()
((name . pattern) template))))))
注意,使用定义语法规则
,简单的宏变得非常非常容易编写。下面是另一个例子:
(define-syntax-rule (let ((name value) ...)
expr ...)
((lambda (name ...)
expr ...)
value ...))
如果您确实需要定义宏语义,可以在mit scheme中获得合理的近似值,如下所示:
(define-syntax define-macro
(syntax-rules ()
((define-macro (name . args) body ...)
(define-syntax name
(rsc-macro-transformer
(let ((transformer (lambda args body ...)))
(lambda (exp env)
(apply transformer (cdr exp)))))))))
然后,您可以将我的时间定义为:
(define-macro (my-when test . branch)
`(if ,test (begin ,@branch)))
+1,特别是建议只使用语法规则。它很卫生,可以避免您以后调试一些非常可怕的错误。谢谢,我以前没有听说过define syntax rule
。它确实简化了代码。但在这里我遇到了一个问题:当我试图求值(定义语法规则(我的when测试分支)(if测试(begin分支))
时,它说;未绑定变量:测试
。顺便说一句,我的方案版本是麻省理工学院方案9.0。1@Javran您是否运行了我粘贴的(定义语法定义语法规则…
?你需要先这么做。对不起,我以为它已经被定义了。现在它工作了,提前谢谢你@Javran在一些方案实现中,比如Racket和Guile,已经定义了它。在麻省理工学院的计划中,我想情况并非如此。:-)无论如何,很高兴这有帮助。:-)