【问题标题】:Undefined variable on sbcl, not on clispsbcl 上的未定义变量,而不是 clisp
【发布时间】:2012-03-17 03:11:03
【问题描述】:

clisp上加载以下2个函数成功。

(defun func1 (l)
  (defvar *count* nil)
  (setq count 1)
  (cond ((null l) 0)
        ((atom l) (+ count 1))
        ((atom (car l)) (+ count (func1 (cdr l))))
        ((listp (car l)) (+ (func1 (car l)) (func1 (cdr l))))
        (t nil))    )
(defun func2 (l)
  (defvar *resLis* nil)
  (setq resLis '((0 0)))
  (anotherFunc l resLis)  
)

但是,sbcl 会导致错误:

warning: undefined variable: COUNT
warning: undefined variable: RESLIS
Compilation failed.

我更喜欢使用sbcl(因为我的slime 只适用于它)但是上面的代码有什么问题?

环境:Ubuntu 11.10、GNU CLISP 2.49、SBCL 1.0.50.0.debian

【问题讨论】:

  • 冒号在那里做什么?
  • 正如我在@Arlen Cuss 回答的评论中提到的那样,我只是试图简化,认为这部分对问题并不重要。由于 2 人想知道,我修改了我的问题以添加隐藏部分。

标签: common-lisp sbcl clisp


【解决方案1】:

SBCL 不会“导致错误”。编译器打印一个警告。如果您使用它的解释器而不是它的编译器,CLISP 可能不会发出警告。 SBCL 默认使用编译器。

怎么了?

  • DEFVAR 是定义全局变量的顶级表单。可以在函数中使用它,但不推荐。

  • count 只是未定义。正如 SBCL 所说。你没有定义变量count

【讨论】:

  • 我忘了提及/引用SBCL 编译失败除了打印警告(我更新了问题描述),这会阻止执行。即使我在函数定义之外声明DEFVAR 行,结果也是一样的。
  • 所以你的第二个项目符号(count 未定义)是我认为SBCL 返回错误的原因。我仍在试图弄清楚为什么 count 没有定义。顺便说一句,现在我检查了CLISP 在我使用compile-file 时也会发出警告,但没有错误。
【解决方案2】:

首先,请注意*count*count 是两个不同的东西。 *resLis*resLis 也是如此。

第二,:func1 中间做什么?

第三,anotherFunc在哪里?

第四,不要在函数中使用defvar;那些是给全局的!

一旦你解决了这些问题,你应该会发现更容易上手。

【讨论】:

  • 谢谢。因为我试图简化问题,所以我省略了我认为不必要的内容(即:anotherFunc)。在4th,您的意思可能是defvar
  • @IsaacS 哎呀,你是对的!您能否阐明代码的意图?帮助我们可能会对您有所帮助。它是否试图计算某些嵌套列表的最大深度?
猜你喜欢
  • 1970-01-01
  • 2017-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多