scheme - Nil 不是空列表吗?

标签 scheme lisp

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

(eq? '() 'nil) ; ==> #f

最佳答案

在 LISP 1.5 nil 中,'nil'()() 计算为 。读者将 ()nil 翻译成同一个单例空列表,它是自评估的,因此引号是可选的。 nil 也是唯一的假值,所有其他值都是真值。第一个 Scheme 实现由与 1.5 兼容的商业 Lisp 托管,并且大部分主机在第一个 Scheme 中透明地使用。 Common Lisp 是 1.5 的后代,仍然像这样工作,但是 Scheme 在报告与报告之间有变化,这些是 R5RS 和更高版本的规则:

空列表是'()。它被引用并计算为 ()。它不是 self 评估的,所以 () 是无效的 Scheme 代码。 '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)

关于scheme - Nil 不是空列表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48998615/

相关文章:

functional-programming - 如何在Scheme/Lisp中添加结构体的元素

scheme - Lisp 对一个新的(大概)程序员来说会很难学吗?

list - 如何在没有 map 的情况下在 Lisp 中创建子列表列表?

lisp - 在 Common Lisp 中存储日期

scheme - 方案中的递归宏导致意外循环

Scheme 中的递归(或 while 循环)

scheme - 如何将方案中的列表拆分为 n 个大小均匀的 block ?

nlp - 如何在此 Racket 代码中使用跟踪?

recursion - Racket/Scheme 中的 zip 函数

memory - 在 Common Lisp (SBCL) 中处理和最小化内存使用