我正在学习Scheme,并使用repl.it 的在线解释器。我无法理解为什么会返回#f
:
(eq? '() 'nil) ; ==> #f
Run Code Online (Sandbox Code Playgroud)
在 LISP 1.5 中nil
,'nil
、'()
和()
的计算结果为nil
。读者将()
和翻译nil
成相同的单例空列表,并且它是自我评估的,因此引用是可选的。nil
也是唯一的错误值,所有其他值都是真实的。第一个Scheme 实现由与1.5 兼容的商业Lisp 托管,并且主机的大部分内容在第一个Scheme 中透明地使用。Common Lisp 是 1.5 的后代,仍然像这样工作,但不同的报告不同,Scheme 发生了变化,这些是 R5RS 及更高版本的规则:
空列表是'()
. 它被引用并评估为()
。它不是自我评估,因此()
是无效的方案代码。'nil
评估nil
哪个是符号而不是空列表。在Scheme中,唯一的假值是#f
,因此空列表是真实的。
在代码中:
'() ; ==> ()
'(1 . (2 . ()) ; ==> (1 2)
() ; ==> ERROR: Illegal empty application (not allowed)
(eq? '() 'nil) ; ==> #f (empty list and nil are different values)
(if '() #t #f) ; ==> #t (empty list is truthy)
Run Code Online (Sandbox Code Playgroud)