2016-04-08 56 views
3

我很抱歉不得不問這個問題,但我試圖做一個簡單的if語句來檢查變量是否爲nilLisp如果不是零

(defun test (input) 
    (let ((testvar (first input))) 
    (if (not nil testvar) 
    (do this) 
    (do that)))) 

任何人都可以解釋正確的語法給我嗎?

+2

只是'(if(not testvar)...)'。或者先把真正的分支放到'(如果testvar ...)'。 – jkiiski

回答

0

jkiiski是對的:

Just(if(not testvar)...)。或者把真正的分支先做,然後做(如果testvar ...)

+2

風格評論:如果testvar是「意圖」是一個布爾值,那麼在我看來,「(如果testvar ...)」和「(if(not testvar)...)」是要走的路。如果testvar是一些其他類型的值,可能恰好爲零,那麼你可以使用'(if(not(null testvar))...)'和'(if(null testvar)..)'。編譯器應該優化它們是相同的,但它可能會使代碼更易於閱讀。 –

1

你想檢查變量是零還是不是零?

對於不是nil:(if v ... ...)

對於零:(if (not v) ... ...)

有(在CL);這些都是邏輯上是相同的,但可指示意圖更好許多變型:(if (null v) ... ...)如果相同第二種情況下上述但可能會向讀者表明您正在尋找`()'而不是邏輯錯誤(即空列表)。還有很多其他的變化。

3

由於nil相當於布爾值false,所以不需要明確地與它比較。

簡單

(if testvar 
    (...) 
    (...)) 

將做的工作。您只需要not,如果您想檢查相反的內容,例如如果您要檢查一個變量是不是nil

(if (not testvar) 
    (...) 
    (...)) 

除此之外,還有被稱爲null謂詞功能,你可以使用。它基本上是指用於檢查一個給定的列表是否爲空,但由於空列表相當於nil,它會工作(如鏈接的頁面上的例子指出):

(null '()) => T 
(null nil) => T 
(null t) => NIL 
(null 1) => NIL 

無論如何,這基本上只將問題向上移動一層;-)