2016-06-15 103 views
-3

功能,我有以下功能如果Common Lisp中

(defun testIf (n) 
    (if (<= n 0) t) 
    print "Hello World") 

我的問題是,當我測試(testIf -1),它返回的 「Hello World」。所以我想知道爲什麼if被完全忽略了。請記住,我只想要一個如果在這個程序中,沒有別的鏈。任何幫助,將不勝感激。

要清理混亂,我試圖做一些類似的Lisp的(如Java有數據類型,我在這個例子中,以彌補這一點)

public int testIf(n) 
{ 
    if(n <= 0) 
     return 5; 

    System.out.println("Hello "World"); 
    return 0; 
} 

testIf(-1); 

在Java 5將被返回,下一行永遠不會被讀取。

+0

你看看Lisp的文檔如何做一個「如果」的聲明? – lurker

+0

是的我有,它表明你可以做(​​如果「測試表達式」「那麼表達式」) – JmanxC

+0

這是常用的lisp我正在使用LispWorks – JmanxC

回答

3

IF不會被忽略;它的返回值只是被丟棄,因爲在它之後還有另一種形式。函數返回正文最後一種形式的值。考慮這個功能

(defun foo() 
    1 
    2) 

您是否期待返回1?當然不是。這完全違反直覺。一個IF只是一個像其他任何形式,所以爲什麼它的結果會返回到你的函數?

你可以使用RETURN-FROM做從功能的早日迴歸:

(defun test-if (n) 
    (when (<= n 0) ; You should use WHEN instead of IF when there's no else-branch. 
    (return-from test-if t)) 
    (print "Hello World")) 

然而,這不是地道的大多數情況。請記住,Lisp是一種與Java非常不同的語言,您不應該嘗試在Lisp中編寫Java。最好把PRINT放在else分支中。正確

(defun test-if (n) 
    (cond ((<= n 0) t) 
     (t (print "Hello World") 
      :foo 
      :bar 
      :quux))) 
0

在Java 5將返回下一行永遠不會被讀取..

jkiiski的回答是:如果else分支有多種形式,可以使用COND代替解釋了這種行爲,但值得指出的是,您編寫的Lisp代碼不像您編寫的Java代碼。如果你想字面翻譯的Java代碼,你會怎麼做:

(defun testIf (n) 
    (if (<= n 0) 
    (return-from testIf 5)) 
    (print "Hello World") 
    (return-from testIf 0)) 

確實返回5,當n小於或等於0

+0

爲了使用'return',你需要創建一個名爲'nil'的塊。或者將'return'改爲'return-from'(例如'(return-from testIf 5)')。 –

+0

@GregBuchholz固定。 DEFUN顯然建立了一個塊,但沒有命名爲NIL。我的錯! –