我刚刚开始学习Common Lisp - 并且很快就爱上了它 - 我刚刚进入了类型系统。我似乎对应用程序编程产生了特别的喜爱。
据我了解,在CL字符串和列表中都是序列,但似乎没有任何标准函数用于映射序列,只有列表。我可以看到为什么它们会被提供给列表,它们是什么,它们是基本的数据类型和所有,但为什么它不是设计用于序列?由于它们是更通用的类型,因此将应用功能定位于它们而不是列表似乎更有用。或者我完全误解了它是如何工作的?
修改
我感到特别困惑的是,序列 - 抽象 - 和列表 - 实现 - 的方式似乎在CL中混乱。共识似乎是出于历史原因; lisp已经存在很长时间了,你几乎可以通过它的函数和宏来规划软件工程实践的发展;哪些函数适用于序列,哪些列表看起来似乎是任意的,因为CL具有仅在列表上运行的前序列抽象函数的混合,以及在序列上以更一般的方式执行相同操作的函数。作为刚刚学习CL的人,我认为如果作者首先将序列作为更清晰的抽象引入,然后在列表中购买作为该抽象的最基本实现,那将是有用的。当然,仍然需要列表作为语法,但是当有必要明确说明这一点时,许多读者会自己解决这个问题,这在开始时会非常自负。
答案 0 :(得分:11)
为什么,有很多函数在处理序列。使用MAP或MAP-INTO完成序列映射。
查看sequences section of the CLHS以了解详情。
还有一个组织得很好的quick reference。
答案 1 :(得分:1)
嗯,你一般都是正确的。大多数功能确实专注于列表(mapcar
,find
,count
,remove
,append
等。)其中一些功能具有相同的功能我想到了序列(concatenate
,some
和every
),以及列表等效过时的一些序列(例如。nth
仅列表与{{1}对于所有序列)。有些函数只是处理序列(例如elt
)。
是的,将映射函数作为方法应该更有用,这些方法按预期应用于所有序列。 CL根本就没有这样构建。如果要在今天再次构建,我相信这会被考虑,并且看起来非常不同。
那就是说,你并没有完全处于寒冷中。 length
宏对序列起作用,loop
(一个单独的循环宏,我碰巧更喜欢)也是如此。这会让你走得更远。对于大多数实际目的,您将使用列表,这不会只是一个实用的问题。如果你碰巧缺少矢量(或一般的序列)的映射函数,谁会阻止你写它?