【发布时间】:2017-10-14 14:53:44
【问题描述】:
我需要使用 defmacro 来实现 my_let*,它的工作原理与 let* 类似,但是当 let* 扩展为一系列嵌套的 let 调用(在幕后)时,my_let* 需要扩展到 single let 调用,并使用 define 语句来定义我得到的参数。
使用 my_let* 的示例:
(my_let* ((a 2)
(b 3)
(c (+ a b)))
(+ a b c))
并且这段代码的返回值应该是 10。就像使用 let* 一样。 上面的代码将在 my_let* 中扩展为以下内容:
(let ()
(define a 2)
(define b 3)
(define c (+ a b))
(+ a b c))
我是使用宏的新手,虽然我成功编写了一些宏,但这个让我迷失了。
提前谢谢你。
【问题讨论】:
-
两个问题:你真的想使用
defmacro,Racket 出于兼容性原因确实有,而不是(更容易)define-syntax、syntax-rules和类似的?此外,您建议的扩展与let*并不完全相同,因为let*允许您隐藏以前的绑定,而define不允许。你同意吗? -
@BrendanCannell 在这种情况下是的,因为它是分配的一部分(其中一部分是宏)。我仍然想了解定义语法的使用。 (也许是将来要学习的课程的一部分)。
-
好的。也许您可以告诉我们您已经尝试过什么以及您在想什么,而不是有人只是给您答案,这样我们就可以为您指明正确的方向。
-
@BrendanCannell 如上所述。这个让我迷路了。我确实成功地编写了其他宏,但即使使用 (define x y) 来定义变量对我来说也是新的,因为我们总是使用 (let x y) 来实现此目的。另外,这里我也说不清内部辅助函数应该做什么。
-
我无法合理猜测您的定义出了什么问题,因为您没有将其提供给我们。那么唯一的答案就是简单地为您编写代码。甚至没有什么可以解释的。这真的是你想要的吗?
标签: macros scheme lisp racket let