Mit-Scheme 中的空值是什么?

30

有人能告诉我在 MIT-Scheme 中“空值表示”是什么吗?在 SICP 书中,应该是“nil”,但它不起作用。 谢谢。

4个回答

29

'() 应该可以工作。在Scheme中,nil是空列表,因此引用一个空列表会得到nil。


好的。谢谢。它有效。我使用 (cons 2 (cons 3 (cons 4 ()))) 进行了测试,结果为 (2 3 4)。 - Khue Vu
哇,这个答案真是救了我一大堆麻烦。我从任何Scheme文档中都只能得到()'nil,显然两者都不能用来表示空列表。而且SICP直到中途才介绍引号,这可能也没有帮助...谢谢! - Sophia Gold

13

这是历史记录。 访问http://web.archive.org/web/20070808004043/http://wiki.wordaligned.org/sicp/published/FrequentlyAskedQuestions

原始链接(已失效):http://wiki.wordaligned.org/sicp/published/FrequentlyAskedQuestions


为什么“nil”无法工作?

简短的答案是:nil不再是Scheme的一部分,请使用 '() 代替。长答案如下...

第2章的早期示例使用nil作为列表终止符,但是当使用(例如)MIT Scheme 运行这些示例时,你会得到以下错误:

;Unbound variable: nil
同样地,在某些实现中,使用()null代替nil可能有效,但两者都不具备可移植性。巫师之书在这个脚注中解决了这个问题。
“值得注意的是,Lisp方言的标准化消耗了大量精力,争论的实际上是一些无意义的问题:nil应该是普通名称吗?nil的值应该是一个符号吗?它应该是一个列表吗?它应该是一对吗?在Scheme中,nil是一个普通名称,我们在本节中将其用作变量,其值为列表的结束标记(就像真实变量具有真实值一样)。包括通用Lisp在内的其他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的使用替换为'()。”

3
我使用MIT/GNU Scheme 微代码15.3版本,()'()都能工作。正如你所说,nilnull无法工作。
1 ]=> ()

;Value: ()

1 ]=> '()

;Value: ()

1 ]=> (cons 1 ())

;Value 2: (1)

1 ]=> (cons 1 '())

;Value 3: (1)

0

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

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

或者使用'() 或 (list ) 替换 ()。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接