应用程序编程和常见的lisp类型

Al *_*ser 5 common-lisp

我刚开始学习Common Lisp - 并且很快就爱上了它 - 我刚刚进入了类型系统.我似乎对应用程序编程产生了特别的喜爱.

据我所知,在CL字符串和列表都是序列,但似乎没有任何标准函数用于映射序列,只有列表.我可以看到为什么它们会被提供给列表,它们是什么,它们是基本的数据类型和所有,但为什么它不是设计用于序列?由于它们是更通用的类型,因此将应用功能定位于它们而不是列表似乎更有用.或者我完全误解了它是如何工作的?

编辑:

我感到特别困惑的是序列 - 抽象 - 和列表 - 实现 - 的方式似乎在CL中混乱.共识似乎是出于历史原因; lisp已经存在很长时间了,你几乎可以通过它的函数和宏来规划软件工程实践的发展; 哪些函数适用于序列,哪些列表看起来似乎是任意的,因为CL具有仅在列表上运行的前序列抽象函数的混合,以及在序列上以更一般的方式执行相同操作的函数.作为刚刚学习CL的人,我认为如果作者首先将序列作为更清晰的抽象引入,然后在列表中购买作为该抽象的最基本实现,那将是有用的.当然,仍然需要列表作为语法,但是当有必要明确说明这一点时,许多读者会自己解决这个问题,这在开始时会非常自负.

Sva*_*nte 12

为什么,有很多函数在序列上工作.使用MAPMAP-INTO完成序列上的映射.

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

还有一个组织得很好的快速参考.


Seb*_*rog 1

嗯,你通常是正确的。大多数函数确实专注于列表(mapcarfindcountremoveappend)。对于其中一些函数,有序列的等效函数(concatenatesomeevery),还有一些,列表等效项已经过时(例如,nth仅适用于列表)与elt所有序列相比)。有些函数仅适用于序列(length例如 )。

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

是的,将映射函数作为方法会更有用,按预期应用于所有序列。CL 根本不是那样构建的。如果今天再建,我肯定会考虑这一点,而且看起来会很不一样。

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

  • COUNT、FIND、REMOVE 在序列上工作得很好。检查 ANSI CL 标准的序列字典。 (5认同)