我很抱歉不得不問這個問題,但我試圖做一個簡單的if
語句來檢查變量是否爲nil
。Lisp如果不是零
(defun test (input)
(let ((testvar (first input)))
(if (not nil testvar)
(do this)
(do that))))
任何人都可以解釋正確的語法給我嗎?
我很抱歉不得不問這個問題,但我試圖做一個簡單的if
語句來檢查變量是否爲nil
。Lisp如果不是零
(defun test (input)
(let ((testvar (first input)))
(if (not nil testvar)
(do this)
(do that))))
任何人都可以解釋正確的語法給我嗎?
jkiiski是對的:
Just(if(not testvar)...)。或者把真正的分支先做,然後做(如果testvar ...)
風格評論:如果testvar是「意圖」是一個布爾值,那麼在我看來,「(如果testvar ...)」和「(if(not testvar)...)」是要走的路。如果testvar是一些其他類型的值,可能恰好爲零,那麼你可以使用'(if(not(null testvar))...)'和'(if(null testvar)..)'。編譯器應該優化它們是相同的,但它可能會使代碼更易於閱讀。 –
你想檢查變量是零還是不是零?
對於不是nil:(if v ... ...)
對於零:(if (not v) ... ...)
有(在CL);這些都是邏輯上是相同的,但可指示意圖更好許多變型:(if (null v) ... ...)
如果相同第二種情況下上述但可能會向讀者表明您正在尋找`()'而不是邏輯錯誤(即空列表)。還有很多其他的變化。
由於nil
相當於布爾值false
,所以不需要明確地與它比較。
簡單
(if testvar
(...)
(...))
將做的工作。您只需要not
,如果您想檢查相反的內容,例如如果您要檢查一個變量是不是nil
:
(if (not testvar)
(...)
(...))
除此之外,還有被稱爲null
謂詞功能,你可以使用。它基本上是指用於檢查一個給定的列表是否爲空,但由於空列表相當於nil
,它會工作(如鏈接的頁面上的例子指出):
(null '()) => T
(null nil) => T
(null t) => NIL
(null 1) => NIL
無論如何,這基本上只將問題向上移動一層;-)
只是'(if(not testvar)...)'。或者先把真正的分支放到'(如果testvar ...)'。 – jkiiski