CLISP:变量 <x> 从函数返回时没有值

CLISP: variable <x> has no value when returning from function

我 运行 遇到 Common Lisp 中的以下问题(使用 CLISP)...以下代码运行正常并且符合预期('->' 指定函数调用的内容 returns):

(list (quote x)) -> (X)

但是,当我尝试将此行为移动到函数中时,

(defun quote-it (x) 
    (list (quote x)))

我调用函数时,出现意外错误。

(quote-it x) -> SYSTEM::READ-EVAL-PRINT: variable X has no value

谁能解释一下这是怎么回事?

谢谢。

如果编译 quote-it,您将收到一条警告,提示您没有使用参数 x 的值。这应该作为一个,嗯,警告有什么不对劲。

具体来说,Common Lisp evaluates 表达式 (quote-it x) 首先,评估 x,其次,将结果传递给 quote-it。由于您从未给 x 一个值,因此第一步失败。

试试这些:

(defparameter x 42)
(quote-it x)
==> (x)
(quote-it 'y)
==> (x)

如您所见,传递给 quote-it 的内容并不重要。

PS:一般来说,特殊运算符quote很少用在函数中。它是 macros 中的常用工具,正如评论者所建议的那样:

(defmacro quote-it (x) `(list ',x))

如果您告诉我们您想要实现什么(在一个单独的问题中),我们(SO 社区)可能会提供更多帮助。

首先计算 (QUOTE-IT X)

为此它计算 X

X 没有价值。

您可以在 backtracestepper:

中轻松看到这一点

CLISP 回溯。

Break 1 [5]> :bt
<1/153> #<SYSTEM-FUNCTION SHOW-STACK> 3
<2/146> #<COMPILED-FUNCTION SYSTEM::PRINT-BACKTRACE>
<3/140> #<COMPILED-FUNCTION SYSTEM::DEBUG-BACKTRACE>
<4/131> #<SYSTEM-FUNCTION SYSTEM::READ-EVAL-PRINT> 2
<5/128> #<COMPILED-FUNCTION SYSTEM::BREAK-LOOP-2-3>
<6/124> #<SYSTEM-FUNCTION SYSTEM::SAME-ENV-AS> 2
<7/110> #<COMPILED-FUNCTION SYSTEM::BREAK-LOOP-2>
<8/108> #<SYSTEM-FUNCTION SYSTEM::DRIVER>
<9/68> #<COMPILED-FUNCTION SYSTEM::BREAK-LOOP>
<10/65> #<SYSTEM-FUNCTION INVOKE-DEBUGGER> 1
<11/55> #<SYSTEM-FUNCTION ERROR>
<12/42> #<COMPILED-FUNCTION SYSTEM::CHECK-VALUE>
[39] EVAL frame for form X
[34] EVAL frame for form (QUOTE-IT X)

CLISP 步进器

[10]> (step (quote-it x))
step 1 --> (QUOTE-IT X)
Step 1 [11]> :s             ; <--- STEP
step 2 --> X                
Step 2 [12]> :S             ; <--- STEP

*** - EVALHOOK: variable X has no value
The following restarts are available:
USE-VALUE      :R1      Input a value to be used instead of X.
STORE-VALUE    :R2      Input a new value for X.
ABORT          :R3      Abort main loop