28

谁能告诉我 mit-scheme 中的空值表示是什么?在 SICP 书中,它应该是“nil”,但它不起作用。谢谢。

4

4 回答 4

26

'()应该管用。基本上,方案中的 nil 是空列表,因此引用空列表会给您 nil。

于 2012-02-02T16:17:52.380 回答
12

有历史。访问http://web.archive.org/web/20070808004043/http://wiki.wordaligned.org/sicp/published/FrequentlyAskedQuestions

原文(破损):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 输入匹配到有问题的语言/实现中。]

于 2012-03-20T11:51:20.120 回答
1

我使用MIT/GNU Scheme microcode 15.3()并且'()一切正常。(正如你所说,nil并且null不起作用)。

1 ]=> ()

;Value: ()

1 ]=> '()

;Value: ()

1 ]=> (cons 1 ())

;Value 2: (1)

1 ]=> (cons 1 '())

;Value 3: (1)
于 2014-10-11T15:33:22.070 回答
0

(list ) '() 和 () 可以表示 null。例如,

(define (transpose mat) (accumulate-n cons () mat))

或将 () 替换为 '() 或 (list )。

于 2014-04-01T18:26:23.817 回答