Lisp,如果不是零

JT9*_*T93 8 lisp null if-statement

我很抱歉不得不提出这个问题,但我正在尝试做一个简单的if陈述,检查一个变量是否nil存在.

(defun test (input)
  (let ((testvar (first input)))
   (if (not nil testvar)
    (do this)
    (do that))))
Run Code Online (Sandbox Code Playgroud)

任何人都可以向我解释正确的语法吗?

Gol*_*den 11

由于nil等效于布尔值false,因此无需明确地与其进行比较.

一个简单的

(if testvar
  (...)
  (...))
Run Code Online (Sandbox Code Playgroud)

会做的.您只需要not检查相反的情况,例如,如果要检查变量不是nil:

(if (not testvar)
  (...)
  (...))
Run Code Online (Sandbox Code Playgroud)

除此之外,还有一个null可以使用的谓词函数.它基本上用于检查给定列表是否为空,但由于空列表等效nil,它将起作用(如链接页面上的示例指出):

(null '()) =>  T
(null nil) =>  T
(null t) =>  NIL
(null 1) =>  NIL
Run Code Online (Sandbox Code Playgroud)

无论如何,这基本上只会将问题向上移动一层;-)


JT9*_*T93 0

jkiiski 是对的:

只是(如果(不是 testvar)...)。或者将 true 分支放在第一位并执行(如果 testvar ...)

  • 风格评论:如果 testvar “打算”成为布尔值,那么在我看来, `(if testvar ...)` 和 `(if (not testvar) ...)` 就是正确的选择。如果 testvar 是其他类型的值,并且可能恰好为 nil,那么您可以使用 `(if (not (null testvar)) ...)` 和 `(if (null testvar) ..)`。编译器可能应该将它们优化为相同,但这可能会使代码更容易被其他人阅读。 (4认同)