2

Lisp 程序员倾向于使用列表来表示所有其他数据类型。

但是,我听说列表不是数据类型的良好通用表示。

与使用记录相比,以这种方式使用列表的缺点是什么?

4

3 回答 3

5

你提到“记录”。由此,我认为您指的是固定元素结构/对象/复合数据。例如,在 HtDP 语法中:

;; a packet is (make-packet destination source text) where destination is a number, 
;; source is a number, and text is a string.

...并且您正在询问将数据包表示为长度为三的列表而不是复合数据(或“记录”)的优缺点。

在适合复合数据的情况下——这些值具有特定的角色和名称,并且它们的数量是固定的——复合数据通常更可取;它们可以帮助您捕获程序中的错误,这是编程的必要条件。

于 2012-01-31T17:26:09.487 回答
3

缺点是通用。有时这与性能有关:您需要恒定时间查找(数组、哈希表)。有时这与组织相关:您想命名数据位置(哈希表、记录……尽管您可以在列表中使用名称、值对)。需要作者付出一点努力才能使代码自我记录(比记录更努力)。有时您希望类型系统通过将事物放在错误的位置(记录、类型化的元组)来捕捉错误。

但是,大多数问题都可以通过 OptimizeLater 解决。列表是一个通用的小数据结构。

于 2012-01-31T16:58:36.943 回答
2

您正在谈论 Peter Seibel 在 Practical Common Lisp 的第 11 章中所说的内容:

[开始] 用列表讨论 Lisp 的集合。. . 常常使读者误以为列表是 Lisp 唯一的集合类型。更糟糕的是,由于 Lisp 的列表是一种非常灵活的数据结构,因此可以将它们用于数组和哈希表在其他语言中的许多用途。但是过分关注列表是错误的。虽然它们是将 Lisp 代码表示为 Lisp 数据的关键数据结构,但在许多情况下,其他数据结构更合适。

一旦您熟悉了 Common Lisp 提供的所有数据类型,您还将看到列表对于构建数据结构的原型很有用,一旦明确了如何使用数据,这些数据结构稍后将被更有效的替代。

我看到的一些原因是:

  • 例如,一个大的哈希表比等效的 alist 具有更快的访问速度
  • 单一数据类型的向量更紧凑,而且访问速度更快
  • 通过索引可以更高效、更轻松地访问向量
  • 对象和结构允许您按名称而不是位置访问数据

它归结为为手头的任务使用正确的数据类型。当它不明显时,您有两种选择:猜测并稍后修复,或者现在弄清楚;其中任何一个有时都是正确的方法。

于 2012-02-02T21:44:33.897 回答