我知道在Lisp中,列表必须以nil结尾,但表达式如
(print (cons 1 (cons 3 2)))
不会抛出任何错误。它打印:
(1 3 . 2)
这是对的吗?
我正在使用GNU Clisp。
答案 0 :(得分:11)
在Lisp中,正确的列表以NIL
结尾,但您也有不正确的列表。一种不正确的列表是最后一个cons单元格在其NIL
中具有CDR
以外的原子的列表。 (1 3 . 2)
就是这样一个不合适的名单。
你甚至可以拥有不合适的列表,它根本没有最后一个单元格。 CAR
和CDR
基本上只是指针,因此您可以拥有循环列表!
在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时达到了结束。 你拥有的是一个带有汽车和点对的列表。