gpt4 book ai didi

scheme - 是否有可能在 mit-scheme 中实现 "define-macro"

转载 作者:行者123 更新时间:2023-12-05 08:44:08 26 4
gpt4 key购买 nike

看完this page .我发现很难记住如何使用 define-syntax 代替 define-macro,所以我想实现 define-macro(或至少在 mit-scheme 中找到一些等价物。

这是我的(有问题的)实现:

(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)))

不过,更严重的是,使用 syntax-rules 编写它非常容易,您真的应该更喜欢它而不是 define-macro

(define-syntax-rule (my-when test branch ...)
(if test
(begin branch ...)))

哦,你以前没见过define-syntax-rule?这是一个简单的宏,您可以使用它来编写单子(monad)句 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,简单的宏如何变得非常非常容易编写。这是另一个例子:

(define-syntax-rule (let ((name value) ...)
expr ...)
((lambda (name ...)
expr ...)
value ...))

关于scheme - 是否有可能在 mit-scheme 中实现 "define-macro",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15552057/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com