条件退货(零)为真

时间:2018-05-26 11:43:12

标签: common-lisp

我几天前开始学习常见的口齿不清,所以请记住我是一个总菜鸟,这是我的代码:

ELISP> (member nil '(2 3 nil))
(nil)

ELISP> (if (member nil '(2 3 nil))
       'true
       'false)
true

所以我的问题是"如果"回归真的吗?

2 个答案:

答案 0 :(得分:5)

我查了the documentation for member

  

如果某个元素满足测试,则返回以此元素开头的 list 的尾部;否则返回nil

在您的情况下,您有一个三元素列表(元素为23nil)。

nil是此列表的成员,因此(member nil '(2 3 nil))返回从找到的元素开始的子列表:

(nil)  ; a one-element list

此值为 true ,因为只有nil本身为false;包含nil的单个元素列表不是假的。

答案 1 :(得分:4)

这种行为是正确的。 (NIL)是长度为1的列表,因此是非空列表,因此在条件发生时被视为T

试试这个:

(if NIL 'true 'false)  ;; false
(if () 'true 'false)    ;; false
(if '() 'true 'false)   ;; false
(if 'NIL 'true 'false)  ;; flase
;; that are all four "identities" of NIL in CL.
;; they are even `eq` to each other, since every lisp has only one 
;; physical address for NIL in their implementation.
;; I imagine it like kind of the root `/` for unix systems ...

;; but (NIL) or ('NIL) or ('()) or (()) are a lists with 1 element in them. thus evaluated to `T`.
(if '(NIL) 'true 'false) ;; true
(if '(()) 'true 'false)  ;; true
(if '('()) 'true 'false) ;; true
(if '('NIL) 'true 'false) ;; true

这就像数学集理论中一样:空集没有元素,因此它是空的。但是如果你把它放入空集,它不再是空的,而是包含元素'empty set'作为它的元素。 这可能是非常哲学的。这个集合的类型包含空集的想法/表示作为其元素......这不仅仅是一些东西。