在Lisp中没有nil的列表

时间:2010-03-04 16:39:41

标签: list lisp null

我知道在Lisp中,列表必须以nil结尾,但表达式如

(print (cons 1 (cons 3 2)))

不会抛出任何错误。它打印:

(1 3 . 2)

这是对的吗?

我正在使用GNU Clisp。

4 个答案:

答案 0 :(得分:11)

在Lisp中,正确的列表以NIL结尾,但您也有不正确的列表。一种不正确的列表是最后一个cons单元格在其NIL中具有CDR以外的原子的列表。 (1 3 . 2)就是这样一个不合适的名单。

你甚至可以拥有不合适的列表,它根本没有最后一个单元格。 CARCDR基本上只是指针,因此您可以拥有循环列表!

在Common Lisp(这是CLISP实现的语言)中,许多标准函数不适用于不正确的列表作为参数。

答案 1 :(得分:9)

你拥有的是dotted list,这是一种improper list

最后一个CDR为NIL的CONS细胞链是proper list

答案 2 :(得分:3)

注意评估正确的列表时会发生什么事情也很有趣:

;; A proper list
(cons '+ (cons 5 (cons 10 '())))
⇒ (+ 5 10)
(eval (+ 5 10))
⇒ 15

评估虚线列表:

;; A dotted list
(cons '+ (cons 5 (cons 10 5000)))
⇒ (+ 5 10 . 5000)
(eval (+ 5 10 . 5000))
⇒ 15

它忽略了终止原子。

答案 3 :(得分:-1)

当您遍历列表时,您知道在达到nil时达到了结束。 你拥有的是一个带有汽车和点对的列表。