【发布时间】:2016-06-05 17:05:01
【问题描述】:
我是 Racket 和 Lisp 的初学者,正在玩语法定义。我定义了一个这样的简单转换:
(define-syntax hello
(syntax-rules (in)
((_ name in world) (format "Hello ~a in ~a" name world))
((_ in name) (format "Hello ~a in here" name))))
现在,当我像这两种情况一样运行它时,它工作正常:
(hello "me" in "world") === "Hello me in world"
还有,
(define in "inside")
(hello me in in) === "Hello me in inside"
但是,这会导致错误,
(let ([in "Shire"])
(hello "Martin" in in)) === Error: hello: bad syntax in: (hello "Martin" in in)
那么,hello 在 let 绑定中失败的原因是什么,而对于定义却可以正常工作?另外,我在哪里可以获得有关此差异的更多具体信息?谢谢。
【问题讨论】:
-
顺便说一句,我刚刚在 IRC 的#racket 上看到了你的问题。你绝对应该坚持超过 2 分钟。 IRC 主要是一种面向潜伏的媒体;如果您只发布实际问题(无需等待任何人回复“有人可以帮忙吗?”请求)然后等待 24 小时得到回复,您将获得最佳结果。 :-) (但是,正如你所知道的,我和 lexi-lambda 都能够在这里回答,所以这毕竟解决了。)