我在书籍和文章中阅读的示例中经常看到这一点:
(caddr *something*)
或者 c***r 命令的许多变体。
对我来说这似乎有点荒谬,当你可以更清楚地把事情拉出来时elt
:
(elt *something* 2)
但我没有看到这种技术被广泛使用。
有没有我不明白的更喜欢 c***r 函数的约定?
我在书籍和文章中阅读的示例中经常看到这一点:
(caddr *something*)
或者 c***r 命令的许多变体。
对我来说这似乎有点荒谬,当你可以更清楚地把事情拉出来时elt
:
(elt *something* 2)
但我没有看到这种技术被广泛使用。
有没有我不明白的更喜欢 c***r 函数的约定?
等函数caddr
可以从嵌套在其他列表中的列表中提取组件。但是elt
只对顶级列表进行操作,因此它可以返回一个完整的嵌套列表,但是您还需要嵌套elt
命令来提取组件,这就是caddr
最终要做的事情,所以它们并不是那么具有可比性。
在某些情况下,您可以互换它们,因为如果您的列表中没有列表,它们可能会返回相同的结果。
elt
是一个适用于列表和数组的通用函数。当您想要编写一个在两种数据类型上以相同方式工作的通用算法时,就需要它。但是这样的算法并不多,因为这通常会对列表不利。
一般约定似乎是:
如果您编写一个通用函数来处理列表,您将使用c(a|d)+r
函数(这些情况非常罕见,因为大多数时候都有一个库函数)。这通常发生在 Stackoverflow 问题代码/类分配代码等中:)
first
如果可能,经验丰富的 Lisp 程序员会使用second
等。最佳实践中有时也会提到这一点。最佳实践通常还会提到应该创建适当的数据结构,而不是处理非平凡的列表。
nth
或者elt
确实很少见,因为很难为它们想出一个好的用例。我可以想象两者如何在宏中使用,其中性能并不重要,但需要某种通用性,例如,如果有人想以相同的方式处理字符串和字符列表。也许在一些原型代码中,程序员还不确定他们将使用什么数据类型,但仅此而已。