我几天前开始学习常见的口齿不清,所以请记住我是一个总菜鸟,这是我的代码:
ELISP> (member nil '(2 3 nil))
(nil)
ELISP> (if (member nil '(2 3 nil))
'true
'false)
true
所以我的问题是"如果"回归真的吗?
答案 0 :(得分:5)
我查了the documentation for member
:
如果某个元素满足测试,则返回以此元素开头的 list 的尾部;否则返回nil。
在您的情况下,您有一个三元素列表(元素为2
,3
和nil
)。
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'作为它的元素。 这可能是非常哲学的。这个集合的类型包含空集的想法/表示作为其元素......这不仅仅是一些东西。