首页 > 解决方案 > Clojure Core 函数参数位置似乎相当混乱。其背后的逻辑是什么?

问题描述

对于我作为一个新的 Clojurian 的我来说,当涉及到参数顺序/位置时,一些核心函数似乎相当违反直觉和令人困惑,这里有一个例子:

> (nthrest (range 10) 5) 
=> (5 6 7 8 9)

> (take-last 5 (range 10)) 
=> (5 6 7 8 9)

也许它背后有一些我还没有看到的规则/逻辑?

我拒绝相信 Clojure 核心团队做出了如此多出色的技术决策,却忘记了函数命名/参数顺序的一致性。

还是我应该按原样记住它?

谢谢


有点题外话:

rand& rand-intVS random-sample- 另一个函数命名似乎不一致的例子,但这是一个很少使用的函数,所以没什么大不了的。

标签: clojurelispclojurescriptclojure-core

解决方案


Clojure.org 上有一个关于这个问题的常见问题解答:https ://clojure.org/guides/faq#arg_order

核心函数中 arg 顺序的经验法则是什么?

主要集合操作数位于第一位。这样就可以写 → 及其同类,它们的位置与它们是否具有可变的参数无关。在 OO 语言和 Common Lisp 中有这样的传统(slot-value, aref, elt)

考虑序列的一种方法是从左侧读取它们,并从右侧馈送:

<- [1 2 3 4]

大多数序列函数消耗和产生序列。因此,将其可视化的一种方法是链:

map <- filter <- [1 2 3 4]

考虑许多 seq 函数的一种方法是它们以某种方式参数化:

(map f) <- (filter pred) <- [1 2 3 4]

因此,序列函数最后获取它们的源,以及它们之前的任何其他参数,并且部分允许如上所述的直接参数化。在函数式语言和 Lisp 中有这样的传统。

请注意,这与最后获取主操作数不同。一些序列函数有多个源(concat、interleave)。当序列函数是可变参数时,它通常在它们的源中。

改编自Rich Hickey 的评论


推荐阅读