gpt4 book ai didi

list - LISP:仿函数位置的非法参数

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

我的代码是这样的:

(defmacro createList (a b c)
(let ((lst (list a b c)))
(write lst)))

(createList 1 2 3 )

我得到:

Illegal argument in functor position: 1 in (1 2 3).

我知道这里有一个类似的问题: Lisp Illegal argument in functor position

但我无法调整我的问题的答案。括号问题在哪里?我做错了什么?

最佳答案

write 函数的结果是它的参数。因此,(write "Tom") 的结果是 "Tom"(它写入输出流的事实是该函数的副作用)。

宏返回一个要计算的形式,通常是一个列表。

您的宏创建列表 (1 2 3),然后将其写出。 write 在宏扩展时计算,而不是“运行时”。因为 write 返回它的参数作为它的返回值,而 write 是最后一个被调用的函数,宏函数的结果就是 write 的结果> 函数,或者,在本例中,(1 2 3)

然后评估

(1 2 3),但是如果您尝试在顶层键入 (1 2 3),它将看到 1 作为表单的第一个参数,并尝试将其作为函数求值——它不是,它只是数字 1。

如果你想看看你的宏会展开什么,你可以试试:(macroexpand '(createlist 1 2 3))

你可以看到下面的结果:

[2]> (macroexpand '(createlist 1 2 3))
(1 2 3)
(1 2 3) ;
T

您会看到第一个 (1 2 3),这是您write 的结果。然后您会看到第二个 (1 2 3),它是宏扩展的结果(上面讨论过),后面是 T,它是 macroexpand 函数。

这就是发生的事情。不清楚如何修复它,因为不清楚您想做什么。

也许这就是您想要做的:

(defmacro createlist (a b c)
`(list ,a ,b ,c))

[5]> (macroexpand `(createlist 1 2 3))
(LIST 1 2 3) ;
T

关于list - LISP:仿函数位置的非法参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35760350/

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