为什么elt不像汽车那样普通,cdr,首先,休息?

时间:2013-11-14 03:19:20

标签: lisp common-lisp

我在书中和文章中看到的例子中看到了很多:

(caddr *something*)

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

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

(elt *something* 2)

但是我没有看到这种技术用得那么多。

是否有一项我不理解的惯例更喜欢c *** r功能?

2 个答案:

答案 0 :(得分:4)

caddr等函数可以从嵌套在其他列表中的列表中提取组件。但elt仅在顶级列表上运行,因此它可以完整地返回嵌套列表,但是您还需要嵌套elt命令来提取组件,这是{{1最终是这样做的,所以它们并没有真正具有可比性。

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

答案 1 :(得分:4)

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

一般惯例似乎是:

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

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

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