sbcl上的未定义变量,而不是clisp上的变量

时间:2012-03-17 03:11:04

标签: common-lisp sbcl clisp

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

2 个答案:

答案 0 :(得分:9)

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

怎么了?

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

  • count根本未定义。正如SBCL所说。您无处定义变量count

答案 1 :(得分:4)

首先,请注意*count*count是两回事。 *resLis*resLis同样如此。

第二,:func1中间做了什么?

第三,哪里是anotherFunc

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

一旦你完成这些工作,你会发现它更容易上手。