【问题标题】:Why does setf work in repl but give an error when compiled?为什么 setf 在 repl 中可以工作,但编译时会报错?
【发布时间】:2014-01-01 16:13:10
【问题描述】:

当我在 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: A Gentle Introduction to Symbolic Computation 工作。

【问题讨论】:

    标签: common-lisp clisp


    【解决方案1】:

    那是因为书籍没有显式声明为变量。在 repl 模式下,您的 lisp 可能会默默地假设它是特殊的,但在编译期间它会引发警告。您可以使用 defvar 或 defparameter 形式“创建”全局动态变量。 (在此处阅读更多信息:http://www.ai.mit.edu/projects/iiip/doc/CommonLISP/HyperSpec/Body/mac_defparametercm_defvar.html)。 要创建类似 C 的全局变量(只是全局变量,即在所有线程之间共享值),您应该在 CLisp 中找到 sb-ext:defglobal 的类比。

    【讨论】:

      【解决方案2】:

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

      现在我们把它写成

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-24
        • 1970-01-01
        • 2021-11-28
        • 1970-01-01
        • 1970-01-01
        • 2021-04-20
        • 2020-06-11
        • 1970-01-01
        相关资源
        最近更新 更多