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
没有价值。
您可以在 backtrace 或 stepper:
中轻松看到这一点
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
我 运行 遇到 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
没有价值。
您可以在 backtrace 或 stepper:
中轻松看到这一点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