day*_*day 4 lisp scheme s-expression
我不明白为什么我们需要nil[1]什么时候到cons一个序列(所谓的正确列表)的项目.在我看来,我们可以通过单独使用所谓的不正确列表(cons没有结束的-ed对nil)来实现相同的目标.由于Lisps [2]已经提供了一个原始过程来区分a pair?和一个原子(某些实现甚至提供atom?),所以当在列表上定义一个过程时,例如length,我可以只用虚线对做同样的事情,如下所示:
(define len
(lambda (l)
(cond ((pair? l) (+ 1 (len (cdr l))))
(else 1) ) ) )
Run Code Online (Sandbox Code Playgroud)
显而易见的是,与传统方法相比,我们可以将此程序应用于不正确的列表,'(1 . (2 . 3))以获得预期的答案.3(length '(1 2 3))
我想听听任何捍卫必要性的意见nil.提前致谢.
[1]让我们忽略的争论焦点nil/ NIL,'()和().
[2]这意味着Lisp语言系列.
Jon*_* O. 20
使用没有nil(或'())的列表就像在没有零的情况下进行算术一样.只使用不对nil,我们如何表示空列表或单个列表'(1)?
它变得更糟:因为列表不必是原子列表,但可以包含其他列表,我们如何表示嵌套列表'(1 2 (3 4))?如果我们执行以下转换:
'(3 4) => '(3 . 4)
'(1 2 x) => '(1 . (2 . x)) == '(1 2 . x)
Run Code Online (Sandbox Code Playgroud)
我们得到:
'(1 2 (3 4)) => '(1 . (2 . (3 . 4))) == '(1 2 3 . 4)
Run Code Online (Sandbox Code Playgroud)
但是也:
'(1 2 3 4) => '(1 . (2 . (3 . 4))) == '(1 2 3 . 4)
Run Code Online (Sandbox Code Playgroud)
因此,仅使用对构造列表并且不会nil阻止我们区分嵌套列表结构和平面列表,至少在列表的末尾.您仍然可以将嵌套列表包含在除最后一个之外的任何元素中,因此现在对列表的元素可能存在奇怪且任意的限制.
理论上,正确的列表是一个归纳定义的数据类型:列表是空列表,或者它有一个first元素,可以是任何东西,而a rest,它总是以相同的方式定义的另一个列表.拿走空列表,现在你有一个数据类型,其中rest 可能是另一个列表,或者它可能是列表的最后一个元素.除非通过传递给我们pair?,否则我们无法分辨,这导致上面嵌套列表的问题.保持nil周围让我们有什么我们喜欢的列表元素,并且使我们能够区分之间1,'(1),'((1))等等.