这是我之前的问题的后续:为什么我们需要 nil?显然,大部分时间都使用正确的列表。但是不适当的清单的目的是什么?
4 回答
没有好的理由。不正确的列表唯一真正有用的是作为关联列表语法的一部分——即便如此,键值对的自定义语法会更好。你能想到的不正确列表的任何使用都可以用记录类型更好地实现——毕竟,包含列表:你可以根据记录来定义 Lisp 列表,但不能反过来(因为列表不允许你定义类型与语言中所有其他类型不相交的数据结构)。
滥用对和列表来表示所有类型的数据是我喜欢称之为Lisp 程序员的疾病,而且这么多 Lisp 拥护者提倡它真是太可惜了。我不得不清理那些东西太多次了。
好问题!(好吧,无论如何,我喜欢克里斯对它的重写......)。根据我的经验,不正确的列表最常见的用途是轻量级的二元素结构。
推理是这样的:“哎呀,我需要一个双元素结构。哦,等等,为什么不直接使用 'cons'?它是内置的,并且它得到了内置引用语法的良好支持。什么咳咳,我会做的。”
特别是,诸如“assoc”之类的内置操作通常以假定给定一个不正确的二元素列表的列表的方式实现。
不正确列表的存在是基本构建块cons
、car
和存在的自然结果cdr
。这三个构成各种更复杂数据类型的基础是 lisp 的核心。以某种方式挑出不适当的驱逐名单将需要施加任意限制。
“不正确的列表”是对任何数据类型的模糊术语,而不是使用 构建的列表cons
。
正如 John 所说,一个例子是使用cons
对,就像在 ML 中使用元组一样。
另一个例子是列表的变体。例如,可以按如下方式定义流:
;; A Stream-of-X is one of
;; - null, ie '()
;; - (cons X Stream-of-X)
;; - a procedure taking no arguments and returning a Stream-of-X result
;; nats-from : nat -> Stream-of-nat
(define (nats-from n)
(cons n (lambda () (nats-from (+ n 1)))))