Clojure的“coll”和“n”是否有更好的编码约定?

Clojure的“coll”和“n”是否有更好的编码约定?,clojure,coding-style,conventions,Clojure,Coding Style,Conventions,在编写clojure代码时,我对何时遵循func coll n格式和func n coll格式感到困惑。 在Clojure/core中, take n coll被使用,而n n coll也是正确的代码。此外,还有reduce funct n coll、get coll n和drop n coll。 在定义这些令人困惑的函数时,是否有关于参数类型正确位置的规则/约定?还是我应该每次都毫无意义地键入doc?我想这要看情况而定。也许核心库实际上是最好的例子。如果你看看你列举的例子: (take n c

在编写clojure代码时,我对何时遵循func coll n格式和func n coll格式感到困惑。 在Clojure/core中, take n coll被使用,而n n coll也是正确的代码。此外,还有reduce funct n coll、get coll n和drop n coll。
在定义这些令人困惑的函数时,是否有关于参数类型正确位置的规则/约定?还是我应该每次都毫无意义地键入doc?

我想这要看情况而定。也许核心库实际上是最好的例子。如果你看看你列举的例子:

(take n coll) 
(drop n coll)
在这两种情况下,从语义上讲,最重要的事情是您正在接受/删除多少元素

在像get coll n这样的例子中,有一个从左到右的语义,即首先拥有一个集合,然后才拥有一个用于获取的索引。我认为N在这方面是相同的。注意,还有其他方法可以从集合中获取索引元素,例如,您也可以这样做:

科尔n

这是因为clojure数据结构(如vector、hash map和set)都可以充当函数。在我看来,这是一种更令人困惑的方法来完成同样的事情,因为它通常更难阅读,并且不像get coll n那样清楚地显示意图

最后,我认为对调用者来说最直观的可能是最好的,它将使您的代码成为未来代码用户最可读/可维护的代码

还有其他考虑。例如,变量arity用例,例如使用&more,您需要首先使用所需的参数以防止歧义。不过,我还是会考虑可读性,因为变量参数函数可以附带自己的可读性问题。斯图尔特·塞拉(Stuart Sierra)在书中谈到了这一点。该函数。。。coll格式用于序列库:map、filter、reduce和c。中间的参数通常是函数而不是数字


func coll n格式用于从集合中选择元素,对于seqable集合使用nth,对于关联集合则使用get

我试着把配置参数放在左边,这样可以更容易地使用部分参数。@cfrick:请在回答中详细说明您的评论好吗?我想了解这背后的想法,我从来没有掌握偏误的窍门,也许这会对我有所帮助。谢谢。@BobJarvis,给定一个接受n个参数的函数f,partial f an arg返回一个接受n-1个参数的函数。新函数类似于f,但第一个参数已设置为arg。假设我有一个名为xss的序列,我想要一个类似的新序列,但只包含每个内部序列的前两个元素。我可以这样做:map take 2%xss或者我可以使用partial:map partial take 2 xss。给出更多的局部参数同样有效。和cfrick一样,我尝试将参数放在第一位,以便于使用partial.burrown,我不喜欢nth的语法。我经常在coll处有一个复杂的表达式,而n通常很简单,但是它被隐藏在长调用表达式的末尾,很难注意到。我还经常在repl中使用相同的参数在take和nth之间来回移动,这意味着重新排列整个表达式。因此,我经常使用我定义的一个函数来代替n,该函数只是反转n的参数。我叫它thn。