Nil 不是空列表吗?

Eug*_*ene 5 lisp scheme

我正在学习Scheme,并使用repl.it 的在线解释器。我无法理解为什么会返回#f

(eq? '() 'nil) ; ==> #f
Run Code Online (Sandbox Code Playgroud)

Syl*_*ter 6

在 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)

  • 也许这是挑剔,但我认为空列表 '() *确实* 会对其自身求值。我认为,它被“显示”“打印”为“()”这一事实是一个历史错误。这同样适用于“nil”等符号。 (2认同)