gpt4 book ai didi

macros - 在宏中使用来自外部(词法)环境的变量

转载 作者:太空宇宙 更新时间:2023-11-03 18:43:04 27 4
gpt4 key购买 nike

如何让这段宏发挥预期的作用? -- 我想从词法环境中捕获 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/

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