【问题标题】:Applicative programming and common lisp types应用程序编程和常见的 lisp 类型
【发布时间】:2009-04-02 11:59:56
【问题描述】:

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

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

编辑:

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

【问题讨论】:

    标签: common-lisp


    【解决方案1】:

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

    查看sequences section of the CLHS 了解更多信息。

    还有一个组织良好的quick reference

    【讨论】:

      【解决方案2】:

      嗯,你通常是正确的。大多数函数确实专注于列表(mapcarfindcountremoveappend 等)对于其中一些函数,有序列的等效函数(concatenatesomeevery 浮现在脑海中),还有一些列表等效项已过时(例如,nth 仅用于列表,elt 用于所有序列)。有些函数只对序列起作用(例如length)。

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

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

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

      【讨论】:

      • COUNT、FIND、REMOVE 在序列上工作正常。检查 ANSI CL 标准的序列字典。
      • 好吧好吧,你知道什么?那里说的有点早了。谢谢!
      • 您可能已经提前发言,但您确实给了我所需的答案。我感到困惑的是,为什么在 CL 中,作为一般情况的序列和作为实现的列表之间的抽象看起来如此混乱;现在我知道这是出于历史原因。谢谢!
      • [烈焰战警] 大如完整,老如旧? :)
      猜你喜欢
      • 1970-01-01
      • 2016-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-13
      • 2012-12-10
      • 2012-07-05
      相关资源
      最近更新 更多