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は 2 つの異なるものであることに注意してください。*resLis*とについても同様resLisです。

第二に、それ:は途中で何をしているのfunc1ですか?

第三に、どこanotherFuncですか?

defvar第 4に、関数内で使用しないでください。それらはグローバル用です!

これらを解決すれば、簡単に始められるはずです。

于 2012-03-17T05:47:34.797 に答える