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

时间:2009-04-02 11:59:56

标签: common-lisp

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

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

修改

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

2 个答案:

答案 0 :(得分:11)

为什么,有很多函数在处理序列。使用MAPMAP-INTO完成序列映射。

查看sequences section of the CLHS以了解详情。

还有一个组织得很好的quick reference

答案 1 :(得分:1)

嗯,你一般都是正确的。大多数功能确实专注于列表(mapcarfindcountremoveappend等。)其中一些功能具有相同的功能我想到了序列(concatenatesomeevery),以及列表等效过时的一些序列(例如。nth仅列表与{{1}对于所有序列)。有些函数只是处理序列(例如elt)。

CL有点混乱。这是一种很大的语言,就像 huge 一样。超过700种功能,AFAIK。它已经老了。其中一些功能按惯例弃用,而其他功能很少(如果有的话)使用。

是的,将映射函数作为方法应该更有用,这些方法按预期应用于所有序列。 CL根本就没有这样构建。如果要在今天再次构建,我相信这会被考虑,并且看起来非常不同。

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