【发布时间】:2019-12-16 20:43:19
【问题描述】:
在下面的代码中,如何让x 和y 变量反映宏调用时给出的表达式?
(defmacro defrule (init-form &rest replication-patterns)
(let (rule-table)
`(destructuring-bind (p x y) ',init-form
#'(lambda (w h) (list x y)))))
当扩展呼叫时:
(defrule (70 (* 1/2 w) (+ h 3)))
它返回:
(DESTRUCTURING-BIND (P X Y) '(70 (* 1/2 W) (+ H 3))
#'(LAMBDA (W H) (LIST X Y)))
带有W 和H 引用的原始表达式丢失。我尝试反引用 lambda 函数创建:
(defmacro defrule (init-form &rest replication-patterns)
(let (rule-table)
`(destructuring-bind (p x y) ',init-form
`#'(lambda (w h) (list ,x ,y)))))
但同样的调用:
(defrule (70 (* 1/2 w) (+ h 3)))
扩展到:
(DESTRUCTURING-BIND
(P X Y)
'(70 (* 1/2 W) (+ H 3))
`#'(LAMBDA (W H) (LIST ,X ,Y)))
返回一个缺点:
#'(LAMBDA (W H) (LIST (* 1/2 W) (+ H 3)))
funcall 不能使用它,并且可以像函数对象一样轻松传递。如何返回一个函数对象,其中包含我作为init-form 的x y 部分的参数传入的表达式,并且闭包函数可以看到W H 引用?
【问题讨论】:
-
这似乎是一个糟糕的设计,需要用户知道变量
W和H是在扩展中生成的。 -
这是程序内部结构的一部分,不打算供用户使用。在调用这个宏时,
W H变量是未知的,所以我想返回一个函数,稍后当它们可用时可以用明确的W H调用。
标签: macros common-lisp