对于 Clojure,是否有更好地放置 'coll' 和 'n' 的编码约定?

Is there coding convention for better place of 'coll' and 'n' for Clojure?

当我编写 clojure 代码时,我对何时遵循 (func coll n) 格式和 (func n coll) 格式感到困惑。
在 Clojure/core, 使用(take n coll),而(nth coll n)也是右码。此外,还有 (reduce func n coll)(get coll n)(drop n coll)
在定义这些令人困惑的函数时,参数类型的正确位置是否有任何 rule/convention?或者我应该每次都输入 doc 没有意义吗?

我认为这取决于。也许核心库实际上最能说明这一点。如果你看看你引用的例子:

(take n coll) 
(drop n coll)

在这两种情况下,从语义上讲,最重要的是你有多少个元素taking/dropping。

在类似 (get coll n) 的情况下,有一个 left-to-right 语义,即先有一个集合,然后再有一个用于获取的索引。我觉得nth在这方面也是一样的。请注意,还有其他方法可以从集合中获取索引元素 - 例如,您也可以这样做:

(coll n)

这是可行的,因为 clojure data-structures 像 vectorhash-mapset 都可以充当函数。 IMO,这是一种更令人困惑的方式来完成同样的事情,因为它通常更难阅读,并且没有像 (get coll n).

那样清楚地显示意图。

最后,我认为对调用者来说最直观的可能是最好的,并且会让你的代码成为未来用户最 readable/maintainable 的代码。

还有其他的考虑。例如,variable-arity 用例(例如使用 & more),您需要首先提供所需的参数以防止歧义。然而,我仍然会首先考虑可读性,因为可变参数函数 can 有它们自己的可读性问题。请参阅来自 Stuart Sierra 的精彩 post,其中谈到了这一点。

序列库使用(func ... coll)格式:mapfilterreduce、&c。介入参数通常是函数而不是数字。

(func coll n) 格式用于 select 集合中的元素,使用 nth 用于 seq 可用集合或 get(可能是省略)来自关联集合。