Lisp 程序员倾向于使用列表来表示所有其他数据类型。
但是,我听说列表不是数据类型的良好通用表示。
与使用记录相比,以这种方式使用列表的缺点是什么?
Lisp 程序员倾向于使用列表来表示所有其他数据类型。
但是,我听说列表不是数据类型的良好通用表示。
与使用记录相比,以这种方式使用列表的缺点是什么?
你提到“记录”。由此,我认为您指的是固定元素结构/对象/复合数据。例如,在 HtDP 语法中:
;; a packet is (make-packet destination source text) where destination is a number,
;; source is a number, and text is a string.
...并且您正在询问将数据包表示为长度为三的列表而不是复合数据(或“记录”)的优缺点。
在适合复合数据的情况下——这些值具有特定的角色和名称,并且它们的数量是固定的——复合数据通常更可取;它们可以帮助您捕获程序中的错误,这是编程的必要条件。
缺点是不通用。有时这与性能有关:您需要恒定时间查找(数组、哈希表)。有时这与组织相关:您想命名数据位置(哈希表、记录……尽管您可以在列表中使用名称、值对)。需要作者付出一点努力才能使代码自我记录(比记录更努力)。有时您希望类型系统通过将事物放在错误的位置(记录、类型化的元组)来捕捉错误。
但是,大多数问题都可以通过 OptimizeLater 解决。列表是一个通用的小数据结构。
您正在谈论 Peter Seibel 在 Practical Common Lisp 的第 11 章中所说的内容:
[开始] 用列表讨论 Lisp 的集合。. . 常常使读者误以为列表是 Lisp 唯一的集合类型。更糟糕的是,由于 Lisp 的列表是一种非常灵活的数据结构,因此可以将它们用于数组和哈希表在其他语言中的许多用途。但是过分关注列表是错误的。虽然它们是将 Lisp 代码表示为 Lisp 数据的关键数据结构,但在许多情况下,其他数据结构更合适。
一旦您熟悉了 Common Lisp 提供的所有数据类型,您还将看到列表对于构建数据结构的原型很有用,一旦明确了如何使用数据,这些数据结构稍后将被更有效的替代。
我看到的一些原因是:
它归结为为手头的任务使用正确的数据类型。当它不明显时,您有两种选择:猜测并稍后修复,或者现在弄清楚;其中任何一个有时都是正确的方法。