【发布时间】:2012-02-02 16:11:04
【问题描述】:
谁能告诉我 mit-scheme 中的空值表示是什么?在 SICP 书中,它应该是“nil”,但它不起作用。 谢谢。
【问题讨论】:
标签: scheme sicp mit-scheme
谁能告诉我 mit-scheme 中的空值表示是什么?在 SICP 书中,它应该是“nil”,但它不起作用。 谢谢。
【问题讨论】:
标签: scheme sicp mit-scheme
'() 应该可以工作。基本上,scheme 中的 nil 是空列表,所以引用一个空列表会给你 nil。
【讨论】:
() 或 'nil ,显然它们都不能用来表示一个空列表。并且 SICP 直到中途才引入报价可能无济于事......谢谢!
原始(损坏):http://wiki.wordaligned.org/sicp/published/FrequentlyAskedQuestions
上述常见问题解答中的文字(以防 Internet 存档损坏):
快速回答是:nil 不再是 Scheme 的一部分,请改用 '()。长答案如下……
第 2 章中的早期示例使用 nil 作为列表终止符,但是当这些示例使用(例如)MIT 方案运行时,您会得到:
;Unbound variable: nil
同样,使用() 或null 代替nil 可能适用于某些实现,但两者都不是可移植的。向导书在此脚注中解决了这个问题
令人惊讶的是,Lisp 方言标准化中的多少精力都消散在了几乎毫无意义的争论中:nil 应该是一个普通的名字吗? nil 的值应该是一个符号吗?它应该是一个列表吗?应该是一对吗?在 Scheme 中,nil 是一个普通名称,我们在本节中将其用作一个变量,其值为列表结束标记(就像 true 是一个具有真值的普通变量一样)。 Lisp 的其他方言,包括 Common Lisp,将 nil 视为特殊符号。这本书的作者们经历了太多的语言标准化争吵,他们希望避免整个问题。一旦我们在 2.3 节中引入了引号,我们将把空列表表示为'(),并完全省略变量 nil。
自从写了这篇文章以来,nil 已经从 Scheme 标准中删除了——但底线是:使用‘(),而不是 nil。 Mike 在发给 accu-sicp 列表的电子邮件中指出:
这是一个麻烦的事情,这个 nil/null/'() 业务。方案 48 和 scm 不定义 null,而 guile 将其定义为类似于 common 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 )。
【讨论】: