gpt4 book ai didi

lisp - 在 LISP 中使用 defmacro 时出现未绑定(bind)变量错误

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

我正在尝试在 LISP 中使用具有两种形式的宏,它评估两种形式但总是返回形式 2 的结果。下面是我正在使用的代码 -

(defmacro testmac (x body) (prog2 x body))

当执行具有以下形式的宏时,它可以正常工作并始终返回第二种形式的 5。

(testmac (- 10 6) (/ 10 2))

但是,当我尝试使用以下形式执行宏时,它会返回错误。

(testmac (print a) (print b)) 

下面是我得到的错误 -

debugger invoked on a UNBOUND-VARIABLE: The variable B is unbound.
Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.
restarts (invokable by number or by possibly-abbreviated name):
0: [ABORT] Exit debugger, returning to top level.
(SB-INT:SIMPLE-EVAL-IN-LEXENV B #<NULL-LEXENV>)

为什么会出现此错误以及如何使用宏来完成此操作?

附言我不能用defun 需要用宏来执行(testmac (print a) (print b))

最佳答案

I am trying to use macro with two forms in LISP, which evaluates both forms but always return the result of form 2.

这通常不是一个好主意 - 尽管它可能只是措辞不准确。宏不应评估代码 - 并非没有充分的理由。通常宏只是转换代码。然后生成的代码决定评估什么。

(defmacro testmac (x body) (prog2 x body))

(testmac (- 10 6) (/ 10 2))

所以 x 是列表 (- 10 6) 而 body 是列表 (/10 2)

您的宏返回第二个列表。

CL-USER 11 > (macroexpand-1 '(testmac (print a) (print b)))
(PRINT B)

宏返回表单 (print b)。然后执行。

CL-USER 12 > (testmac (print a) (print b))

Error: The variable B is unbound.

如果 B 未定义,您会得到您看到的错误。

没有魔法发生。

关于lisp - 在 LISP 中使用 defmacro 时出现未绑定(bind)变量错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43069556/

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