我刚刚开始学习Common Lisp,并且很快就爱上了它,而我刚开始使用类型系统。我似乎对应用程序编程特别感兴趣。
据我了解,在CL字符串和列表中都是序列,但是似乎没有用于映射序列的任何标准函数,只有列表。我可以看到为什么将它们提供给列表,它们是基本数据类型又是所有数据,但是为什么它不被设计为与序列一起使用?由于它们是更通用的类型,因此将应用程序功能定位于它们而不是列表似乎更有用。还是我完全误解了它的工作原理?
编辑:
我特别感到困惑的是,在CL中混淆了序列(抽象)和列表(实现)的方式。共识似乎是,这是出于历史原因。 lisp已经存在了很长时间,您几乎可以通过其功能和宏来规划出软件工程实践的发展;乍看之下,哪些功能适用于序列,哪些功能适用于列表,乍一看似乎是任意的,因为CL混合了仅对列表进行操作的预序列提取功能,以及对序列进行更一般方式处理相同功能的功能。作为目前正在学习CL的人,我认为如果作者首先引入序列作为更简洁的抽象,然后再购买列表作为该抽象的最基本实现,那将很有用。当然,仍然需要列表作为语法,但是到了必须明确指出这一点的时候,许多读者将自己解决这个问题,这在开始时将是一个自我的插入。
最佳答案
好吧,你通常是正确的。实际上,大多数函数的确专注于列表(mapcar
,find
,count
,remove
,append
等)。对于其中的一些,序列的等效功能(想到的是concatenate
,some
和every
)以及一些与列表等效的功能已过时(例如,仅列表的nth
与所有序列的elt
)。一些函数仅对序列起作用(例如length
)。
CL有点困惑。这是一门大语言,就像一门巨大的语言。 AFAIK拥有700多种功能。而且很旧。这些功能中的某些功能已按惯例弃用,而其他功能则很少使用(如果有的话)。
是的,将映射函数作为按预期应用在所有序列上的方法将更有用。 CL根本不是那样构建的。如果今天再次 build 它,我相信这将被考虑,并且它将看起来非常不同。
就是说,您并没有完全被冷落。 loop
宏可以处理序列,iterate
可以处理序列(一个单独的循环宏,我碰巧更喜欢)。这将使您走得更远。出于大多数实际目的,您将使用列表,这仅是一个务实的问题。如果您确实缺少向量(或一般而言,序列)的映射功能,谁会阻止您编写它?
关于common-lisp - 应用程序编程和常见的Lisp类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/709411/