谁能告诉我 mit-scheme 中的空值表示是什么?在 SICP 书中,它应该是“nil”,但它不起作用。谢谢。
4 回答
'()
应该管用。基本上,方案中的 nil 是空列表,因此引用空列表会给您 nil。
原文(破损):http ://wiki.wordaligned.org/sicp/published/FrequentlyAskedQuestions
上述常见问题解答中的文本(以防 Internet 存档损坏):
为什么“零”不起作用?
快速回答是:nil 不再是 Scheme 的一部分,'()
而是使用它。长答案如下……</p>
第 2 章中的早期示例nil
用作列表终止符,但是当这些示例使用(例如)MIT 方案运行时,您会得到:
;Unbound variable: nil
类似地,使用()
或null
代替nil
可能适用于某些实现,但都不是可移植的。向导书解决了此脚注中的问题
令人惊讶的是,Lisp 方言标准化中的多少精力已经消散在实际上毫无意义的争论中:nil 应该是一个普通的名字吗?nil 的值应该是一个符号吗?它应该是一个列表吗?应该是一对吗?在 Scheme 中,nil 是一个普通名称,我们在本节中将其用作一个变量,其值为列表结束标记(就像 true 是一个具有真值的普通变量一样)。Lisp 的其他方言,包括 Common Lisp,将 nil 视为特殊符号。这本书的作者们经历了太多的语言标准化争吵,他们希望避免整个问题。一旦我们在 2.3 节中引入了引号,我们将把空列表表示为 '() 并完全省略变量 nil。
自从写了这篇文章以来,nil 已经从 Scheme 标准中删除了——但底线仍然存在:使用 '(),而不是 nil。在发给 accu-sicp 列表的电子邮件中,Mike 指出:
这是一个麻烦的事情,这个 nil/null/'() 业务。Scheme48 和 scm 没有定义 null,而 guile 将其定义为类似于普通 lisp 的 null 的过程(与它的 nil 一起使用,其行为类似于 cl 的 nil,它本身与 '() 不同——也许这与fsf 计划在 guile 中重新做 emacs)。我认为最好的办法是用 '() 代替作者对 nil 的使用。
[复制了一点印刷清理,以更好地将 Markdown 和通常的 ASCII 输入匹配到有问题的语言/实现中。]
我使用MIT/GNU Scheme microcode 15.3
,()
并且'()
一切正常。(正如你所说,nil
并且null
不起作用)。
1 ]=> ()
;Value: ()
1 ]=> '()
;Value: ()
1 ]=> (cons 1 ())
;Value 2: (1)
1 ]=> (cons 1 '())
;Value 3: (1)
(list ) '() 和 () 可以表示 null。例如,
(define (transpose mat) (accumulate-n cons () mat))
或将 () 替换为 '() 或 (list )。