5

我在书籍和文章中阅读的示例中经常看到这一点:

(caddr *something*)

或者 c***r 命令的许多变体。

对我来说这似乎有点荒谬,当你可以更清楚地把事情拉出来时elt

(elt *something* 2)

但我没有看到这种技术被广泛使用。

有没有我不明白的更喜欢 c***r 函数的约定?

4

2 回答 2

5

等函数caddr可以从嵌套在其他列表中的列表中提取组件。但是elt只对顶级列表进行操作,因此它可以返回一个完整的嵌套列表,但是您还需要嵌套elt命令来提取组件,这就是caddr最终要做的事情,所以它们并不是那么具有可比性。

在某些情况下,您可以互换它们,因为如果您的列表中没有列表,它们可能会返回相同的结果。

于 2013-11-14T03:33:20.347 回答
5

elt是一个适用于列表和数组的通用函数。当您想要编写一个在两种数据类型上以相同方式工作的通用算法时,就需要它。但是这样的算法并不多,因为这通常会对列表不利。

一般约定似乎是:

  • 如果您编写一个通用函数来处理列表,您将使用c(a|d)+r函数(这些情况非常罕见,因为大多数时候都有一个库函数)。这通常发生在 Stackoverflow 问题代码/类分配代码等中:)

  • first如果可能,经验丰富的 Lisp 程序员会使用second等。最佳实践中有时也会提到这一点。最佳实践通常还会提到应该创建适当的数据结构,而不是处理非平凡的列表。

  • nth或者elt确实很少见,因为很难为它们想出一个好的用例。我可以想象两者如何在宏中使用,其中性能并不重要,但需要某种通用性,例如,如果有人想以相同的方式处理字符串和字符列表。也许在一些原型代码中,程序员还不确定他们将使用什么数据类型,但仅此而已。

于 2013-11-14T07:22:19.827 回答