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

CLISP:变量<;x>;从函数返回时没有值,lisp,common-lisp,clisp,Lisp,Common Lisp,Clisp,我在Common Lisp(使用CLISP)中遇到以下问题。。。以下代码运行正常,与预期一样(“->”指定函数调用返回的内容): 但是,当我尝试将此行为移动到函数中时 (defun quote-it (x) (list (quote x))) 当我调用函数时,我得到了一个意外的错误 (quote-it x) -> SYSTEM::READ-EVAL-PRINT: variable X has no value 有人能解释一下这是怎么回事吗 谢谢。如果您编译引用它,您将收到一条

我在Common Lisp(使用CLISP)中遇到以下问题。。。以下代码运行正常,与预期一样(“->”指定函数调用返回的内容):

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

(defun quote-it (x) 
    (list (quote x)))
当我调用函数时,我得到了一个意外的错误

(quote-it x) -> SYSTEM::READ-EVAL-PRINT: variable X has no value
有人能解释一下这是怎么回事吗


谢谢。

如果您编译
引用它
,您将收到一条警告,说明您没有使用参数
x
的值。这应该是一个,嗯,有什么不对劲的警告

具体来说,Common Lisp首先通过计算
x
,然后将结果传递给
quote it
,从而将表达式
(quote it x)
。由于您从未给
x
一个值,因此第一步失败

试试这些:

(defparameter x 42)
(quote-it x)
==> (x)
(quote-it 'y)
==> (x)
正如您所看到的,传递给
的内容并不重要,请引用它

PS:一般来说,函数中很少使用特殊运算符。不过,正如评论员所建议的,它是宏中的常用工具:

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

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

如果您编译
引用它
,您将收到一条警告,说明您没有使用参数
x
的值。这应该是一个,嗯,有什么不对劲的警告

具体来说,Common Lisp首先通过计算
x
,然后将结果传递给
quote it
,从而将表达式
(quote it x)
。由于您从未给
x
一个值,因此第一步失败

试试这些:

(defparameter x 42)
(quote-it x)
==> (x)
(quote-it 'y)
==> (x)
正如您所看到的,传递给
的内容并不重要,请引用它

PS:一般来说,函数中很少使用特殊运算符。不过,正如评论员所建议的,它是宏中的常用工具:

(defmacro quote-it (x) `(list ',x))
如果你告诉我们你想要实现什么(在一个单独的问题中),我们(SO社区)可能会提供更多帮助。

首先它评估
(QUOTE-it X)

为此,它计算
X

X
没有值

您可以在回溯或步进器中轻松看到这一点:

CLISP Backtrace.

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)
中断1[5]>:bt
# 3
#
#
# 2
#
# 2
#
#
#
# 1
#
#
[39]表格X的评估框架
[34]表格的评估框架(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
[10]>(步骤(引用x))
第1步-->(QUOTE-IT X)
步骤1[11]>:s;X
步骤2[12]>:S 首先,它计算
(QUOTE-it X)

为此,它计算
X

X
没有值

您可以在回溯或步进器中轻松看到这一点:

CLISP Backtrace.

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)
中断1[5]>:bt
# 3
#
#
# 2
#
# 2
#
#
#
# 1
#
#
[39]表格X的评估框架
[34]表格的评估框架(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
[10]>(步骤(引用x))
第1步-->(QUOTE-IT X)
步骤1[11]>:s;X

步骤2[12]>:S;很好的解释,但我认为宏可能做了您想要的:(defmacro引用它(x)`(list(quote,x)))很好的解释,但我认为宏可能做了您想要的:(defmacro引用它(x)`(list(quote,x)))