2012-03-17 16 views
1

clisp上加載以下2個函數會成功。sbcl未定義的變量,而不是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

+0

在那裏做什麼冒號? – 2012-03-17 08:55:04

+0

正如我在@Arlen Cuss的回答中所提到的,我只是試圖簡化,認爲這部分對於這個問題並不重要。由於2人想知道,我修改了我的問題添加隱藏部分。 – IsaacS 2012-03-17 14:09:04

回答

9

SBCL不 '導致錯誤'。編譯器打印警告。如果你使用它的解釋器而不是它的編譯器,CLISP可能不會提出警告。 SBCL默認使用編譯器。

怎麼了?

  • DEFVAR是定義全局變量的頂級表單。在功能中使用它是可能的,但不推薦。

  • count是簡單的未定義。正如SBCL所說。你沒有定義變量count

+0

我忘記提及/引用'SBCL'編譯失敗,除了打印警告(我更新了問題描述),這阻止了執行。即使我在函數定義之外聲明'DEFVAR'行,結果也是一樣的。 – IsaacS 2012-03-17 04:25:58

+0

所以你的第二個項目符號('count'沒有被定義)就是爲什麼'SBCL'返回我認爲錯誤的原因。我仍然試圖找出爲什麼'count'沒有被定義。順便說一句,現在我已經檢查了'CLISP'也警告我使用'編譯文件'但沒有錯誤。 – IsaacS 2012-03-17 16:08:08

4

首先,請注意,*count*count是兩個不同的東西。 *resLis*resLis也是如此。

二,那:在做什麼func1

三,anotherFunc哪裏?

四,在功能中不要使用defvar;那些是全局的!

一旦你解決了這些問題,你會發現它更容易上手。

+0

謝謝。因爲我試圖簡化問題,所以省略了我認爲不必要的部分(即':'和'anotherFunc')。在'4th',你可能意味着'defvar'。 – IsaacS 2012-03-17 14:02:53

+0

@IsaacS哎呀,你是對的!你能否澄清代碼的意圖?這可能對我們幫助你很有幫助。它試圖計算一些嵌套列表的最大深度? – Ashe 2012-03-17 23:23:23

+0

感謝您的關注。我填補了缺失的部分。 – IsaacS 2012-03-28 15:09:52