如何让这段宏发挥预期的作用? -- 我想从词法环境中捕获 p 而不必将其作为参数发送给宏。
(define-syntax-rule (fi a b)
(if p a b)) ;--->capture `p` from lexical env
(let ((p #t))
(fi 1 2))
奖金谢谢 -- 我如何在 CL 中做同样的事情?
最佳答案
在 Common Lisp 中,宏只是一个函数,它将代码的列表结构作为输入并返回表示新代码的列表结构。
(defmacro fi (a b)
`(if p ,a ,b))
所以如果你像这样使用 fi:
(let ((p t)) ; Common Lisp uses 't' for truth.
(fi 1 2))
就好像你输入了:
(let ((p t))
(if p 1 2))
要了解如何进行此扩展,请将 fi 想象成一个函数,并为其提供参数 1 和 2。
(fi 1 2) => (if p 1 2)
然后获取它返回的列表结构并将其替换为对 fi 的调用。
您给出的示例很简单,因为参数对自身求值。如果你有更复杂的表达式(* 1 1)和(+ 1 1),实际的列表结构被传入(a的值是列表(* 1 1),b的值是列表(+ 1 1))
(fi (* 1 1) (+ 1 1)) => (if p (* 1 1) (+ 1 1))
关于macros - 在宏中使用来自外部(词法)环境的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25576624/