2

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

(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

4

2 回答 2

10

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

怎么了?

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

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

于 2012-03-17T03:38:14.280 回答
4

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

第二,那:中间在做什么func1

第三,在哪里anotherFunc

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

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

于 2012-03-17T05:47:34.797 回答