5

我刚刚开始学习 Common Lisp——并且很快就爱上了它——而且我刚刚进入了类型系统。我似乎特别喜欢应用程序编程。

据我了解,在 CL 中,字符串和列表都是序列,但似乎没有用于映射序列的任何标准函数,只有列表。我可以看到为什么要为列表提供它们,它们是基本数据类型等等,但为什么它不是设计用于序列?由于它们是一种更通用的类型,因此将应用函数作为目标而不是列表似乎更有用。还是我完全误解了它的工作原理?

编辑:

我感到特别困惑的是,序列——抽象——和列表——实现——似乎在 CL 中被混淆了。共识似乎是这是出于历史原因;lisp 已经存在了很长时间,你几乎可以通过它的函数和宏来规划软件工程实践的发展;乍一看,哪些函数适用于序列,哪些适用于列表似乎是任意的,因为 CL 混合了仅在列表上运行的预序列抽象函数,以及在序列上以更一般的方式执行相同操作的函数。作为目前刚刚学习 CL 的人,我认为如果作者首先引入序列作为更清晰的抽象,然后购买列表作为该抽象的最基本实现,那将会很有用。

4

2 回答 2

12

为什么,有很多函数在序列上工作。使用MAPMAP-INTO对序列进行映射。

查看CLHS 的序列部分以了解更多信息。

还有一个组织良好的快速参考。

于 2009-04-02T13:25:57.970 回答
1

好吧,您通常是正确的。大多数函数确实专注于列表(, mapcar, find,countremoveappend。其中一些有序列等效函数(concatenate,some和与所有序列)。有些函数只对序列起作用(例如 )。everyntheltlength

CL有点乱。它是一种大语言,就像在巨大的. 超过 700 个功能,AFAIK。而且它很旧。其中一些函数按惯例已被弃用,而其他函数则很少使用(如果有的话)。

是的,将映射函数作为方法,按预期应用于所有序列会更有用。CL 根本不是那样构建的。如果它今天再次建造,我相信会考虑这一点,它看起来会非常不同。

也就是说,你并没有完全被冷落。该loop宏也适用于序列iterate(一个单独的循环宏,我碰巧更喜欢它)。这会让你走得更远。对于大多数实际目的,您将使用列表,这只是一个实用问题。如果你碰巧缺少向量(或一般的序列)的映射函数,谁来阻止你写它?

于 2009-04-02T13:18:53.027 回答