为什么根据这本书,CL中两个“非”函数的函数组合会导致nil?
我正在学习《Common LISP: A Gentle Introduction to Symbolic Computation》这本书。这本书大约有 40 年的历史,显然,有点经典。
在第 1 章中,作者使用框来解释具有输入和输出的函数。这是其中一张图:
其实上图就是这个问题的答案。我得到了第一个问题和第二个问题:
然而,第三个问题似乎很奇怪:
(not (not ...)) 的组成取决于“...”变量部分。例如,终端显示:
CL-USER> (not (not 12))
T
CL-USER> (not (not nil))
NIL
这本书的练习在某些方面似乎是错误的。但是,由于我对 CL 不太了解,我认为最好问问更有经验的 CL 开发人员是否也认为这是答卷中的一个奇怪点。
我正在使用 SBCL、Slime 和 Common Lisp。我是 CL 的新手,但我在 Racket 方面有一些经验。
提前致谢
回答
练习 1.14:
实际上作者希望我们使用符号NOT作为函数的输入NOT。输入不是命名的函数NOT,也不是命名的变量NOT。因此需要在计算中引用符号:
> (NOT 'NOT)
NIL
由于每个符号都是真,非真就是假。Common Lisp 中的false是符号NIL。
符号NIL和之间有什么区别NOT?
NIL对自己进行评估NOT没有默认值并计算为变量。要将符号评估NOT为自身,需要引用它。
这在旧版本的第3.8章使用符号和列表作为数据进行了解释。
- ah right, makes total sense. (never believe an OP's statement without checking!) if only they'd included the preceding example of `FRED --> [ NOT ] --> NIL`, it'd be that much clearer. it's so early in the book, where it still only deals with symbols and numbers...