gpt4 book ai didi

common-lisp - 基本 Lisp 宏错误

转载 作者:行者123 更新时间:2023-12-01 09:08:50 25 4
gpt4 key购买 nike

请在这里提供一点帮助。我正在尝试创建这个 lisp 宏,它将一个(数字)列表作为输入并返回这些数字的总和。编码

(setf g (list 1 2 3 4))

(defmacro add-test(var)
`(+ ,@var))
(add-test g)给出这个错误
The value G is not of type LIST.
[Condition of type TYPE-ERROR]

同时 (add-test (1 2 3 4))给出正确的结果是 10。

你能解释一下,为什么将变量传递给函数时它不起作用?

其他详情 -

Lispbox - SBCL

Ubuntu Linux

提前致谢

最佳答案

这很简单,也是最常见的宏观问题之一。

(add-test g)

现在进行宏扩展,宏 ADD-TEST使用参数 VAR 调用获取值 G ,一个符号。

然后你尝试一个列表操作。反引号表达式
`(+ ,@var)
VAR的值是 G ,然后尝试将其拼接到列表中 (+ ... ) .现在返回的表达式是 (+ . G) .
CL-USER 12 > (macroexpand '(add-test g))
(+ . G)
T
(+ . G)不是有效的 Lisp 形式。它不是有效的源代码。

请记住,宏的参数是未计算的源表达式。

将其与以下内容进行比较:
CL-USER 13 > (macroexpand '(add-test (1 2 3 4)))
(+ 1 2 3 4)
T

你说:“你能解释一下,为什么将变量传递给函数时它不起作用?”

记住, ADD-TEST不是一个函数,它是一个宏。宏获取传递的源代码并返回一个新表单 - 然后对该表单进行评估。

关于common-lisp - 基本 Lisp 宏错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3755280/

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