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