Common lisp 为什么setf在repl中工作,但在编译时会出现错误?

Common lisp 为什么setf在repl中工作,但在编译时会出现错误?,common-lisp,clisp,Common Lisp,Clisp,当我在repl中使用setf时,它可以正常工作,但是如果我尝试在文件中使用它,然后编译它并将其发送给repl,它会给出一个错误。为什么我会看到这种奇怪的行为 在repl中工作良好: (setf books '((war-and-peace leo-tolstoy) (spin charles-wilson) (harry-potter jk-rowling) (speaker-for-the-dead orson-scott-card))) 从文件编译时出现此错误: clagitsc.l

当我在repl中使用setf时,它可以正常工作,但是如果我尝试在文件中使用它,然后编译它并将其发送给repl,它会给出一个错误。为什么我会看到这种奇怪的行为

在repl中工作良好:

(setf books 
  '((war-and-peace leo-tolstoy)
(spin charles-wilson)
(harry-potter jk-rowling)
(speaker-for-the-dead orson-scott-card)))
从文件编译时出现此错误:

clagitsc.lisp:187:1:
warning: 
BOOKS is neither declared nor bound,
it will be treated as if it were declared SPECIAL.
warning: 
in #:|187 193 (SETF BOOKS '(# # # ...))-34| in lines 187..193 : BOOKS is neither    
declared nor bound,
it will be treated as if it were declared SPECIAL.

Compilation failed.

我在使用CLisp 2.49的windows上使用带有emacs 24.3的slime,我正在通过Common Lisp(符号计算的温和介绍)进行工作

这是因为books没有显式声明为变量。在repl模式下,lisp可能会默默地假定它是特殊的,但在编译过程中会抛出警告。您可以使用defvar或defparameter表单“创建”全局动态变量。(请在此处阅读更多内容:)。
要创建类似C的全局变量(只是全局变量,即在所有线程之间共享值),您应该在CLisp中找到Simulator for sb ext:defglobal。

这是因为books没有明确声明为变量。在repl模式下,lisp可能会默默地假定它是特殊的,但在编译过程中会抛出警告。您可以使用defvar或defparameter表单“创建”全局动态变量。(请在此处阅读更多内容:)。
要创建类似C的全局变量(只是全局变量,即在所有线程之间共享值),您应该在CLisp中找到模拟sb ext:defglobal。

设置未声明变量的确切效果在Common Lisp中未定义。在CLISP中,您将得到一个警告。但是警告不是错误,编译通常不会因此在CLISP中失败

现在我们把它写成

(defvar *books* '(...))

并使用变量
*books*
来明确它是一个全局声明为特殊的变量。它可以防止与词汇变量发生冲突。

设置未声明变量的确切效果在Common Lisp中未定义。在CLISP中,您将得到一个警告。但是警告不是错误,编译通常不会因此在CLISP中失败

现在我们把它写成

(defvar *books* '(...))
并使用变量
*books*
来明确它是一个全局声明为特殊的变量。它可以防止与词汇变量发生冲突