2011-05-23 88 views
3

我試圖使用case語句使一些代碼更具可讀性。它似乎是一系列if語句,但由於某些原因,case語句總是接受一個比較,即使它不是真的。有人可以澄清爲什麼會發生這種行爲?簡單的Lisp案例語句問題 - 與無比較的問題

實施例:

> (case 'a    
    (nil nil)   
    (otherwise 'b)) 
NIL     
> (case 'a    
    ('a 'b)   
    (otherwise nil)) 
B      

在上述例子中,第一個實例返回nil,即使「明確不是nil。試圖做同樣的事情,如果語句表現爲我所期望的:

> (if (eq 'a nil) nil 'b)  
B        
> (if (eq 'a 'a) 'b nil)  
B        

我假設有關於case語句我不明白有些行爲。任何幫助,將不勝感激。

編輯: 只是爲了澄清,我知道'一個不會被評估。我只是嘲笑這個例子,以創造一種情況,其中案例陳述的目標絕對不是零。

我正在使用xlisp-plus,但我將嘗試一個真正的clisp安裝並查看它的行爲是否有所不同。

編輯(多一次): 安裝CLISP,它在那裏工作得很好。調查爲什麼xlisp不同是不值得的麻煩。感謝大家的理智檢查。

+0

真奇怪。我剛剛在GNU Common Lisp 2.6.7中嘗試了第一種情況下的表達式,並且(如預期的那樣)評估爲B. – 2011-05-23 14:00:17

+4

「xlisp」是來自[網頁](http://www.xlisp。)的重要信息。 org /):「XLISP 3.0是Lisp的** Scheme **方言的超集」 – 2011-05-23 14:34:14

回答

1

我認爲這取決於你的LISP版本。 我在Mac LispWorks和我的結果:

CL-USER 2 : 1 > (case 'a    
    (nil nil)   
    (otherwise 'b)) 
B 
+0

我安裝了CLISP,它在那裏按預期工作。必須是xlisp的東西...... – 2011-05-23 14:22:03

1

同樣在這裏與SBCL:

CL-USER> (case 'a 
      (nil nil) 
      (otherwise 'b)) 
B 

也就是說,'a符號,因此絕不可能nil

0

case形式的值隱含引用文字的列表,所以這樣的:

(case 'a 
    ((a) 'b) 
    (otherwise nil)) 

是你想要的。 otherwise應該工作(正如其他人所說) - 嘗試t

順便說一句,當你使用'a讀者把它讀成(quote a)這意味着它也將選擇它當值quote,例如:

(case 'quote 
    ('a 'b) 
    (otherwise nil)) 
3

CASE每個關鍵指標的可能無論是文字列表還是單個原子。然而,CLtL says that the atom must not be NIL,因爲它是否是字面NIL或空列表是不明確的。使用的NIL代替列表:

> (case 'a 
    ((nil) nil)   
    (otherwise 'b)) 
B 
> (case nil 
    ((nil) nil)   
    (otherwise 'b)) 
NIL 
+0

在令人印象深刻的無用性顯示中,即使是格式化問題的方法,xlisp也會失敗。 – 2011-05-23 14:20:54

+0

XLISP不是Common Lisp方言。我想總是有'COND';) – WReach 2011-05-23 14:27:24

2

Common Lisp中預計,CASE的項目,以測試是一個原子或原子的列表。測試也是EQL的功能。

(case 'a 
    (a 'b) ; EQL a 
    (otherwise 'foo)) 

(case 'a 
    ((a b c) 'foo) ; EQL to one of a, b or c 
    (otherwise 'bar)) 

僅引用意外作品。不要使用它:

; don't use this: 
(case 'a 
    ('a 'foo) ; <- bad! , EQL to QUOTE or A 
    (otherwise 'bar)) 

上面是一樣的:

; don't use this: 
(case 'a 
    ((quote a) 'foo) ; <- bad! , EQL to QUOTE or A 
    (otherwise 'bar))