这是我上一个问题的后续跟进:Why do we need nil?显然,大多数时候都会使用正确的列表。但是不正确的清单的目的是什么?
答案 0 :(得分:6)
好问题! (好吧,我喜欢克里斯'重写它,无论如何......)。根据我的经验,不正确列表的最常见用法是轻量级双元素结构。
推理是这样的:“哎呀,我需要一个双元素的结构。哦,等等,为什么不只是使用'cons'?它是内置的,内置的引用语法非常好地支持它什么事,我会做的。“
特别是,诸如“assoc”之类的内置操作通常以假定给出一个不正确的双元素列表列表的方式实现。
答案 1 :(得分:5)
没有充分的理由。不正确的列表唯一真正有用的是作为关联列表语法的一部分 - 甚至在那里,键值对的自定义语法会更好。任何你可以想到的不正确列表的用法都可以用记录类型更好地实现 - 毕竟,它包含了列表:你可以用记录来定义Lisp列表,但不是相反的方式(因为列表不允许)您定义的类型与语言中的所有其他类型不相交的数据结构。
滥用对和列表来表示所有类型的数据是我喜欢称之为 Lisp程序员的疾病,而且很多Lisp倡导者提倡的是一个真正的耻辱为了它。我不得不多次清理那些东西。
答案 2 :(得分:4)
不正确清单的存在是基本构建模块cons
,car
和cdr
存在的自然结果。它是lisp的核心,它们构成了各种更复杂数据类型的基础。以某种方式单独列出不适当的放逐名单需要施加任意限制。
答案 3 :(得分:1)
“不正确的列表”是除使用cons
构建的列表之外的任何数据类型的模糊术语。
正如约翰所说,一个例子是使用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)))))