当我编写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)
.
在定义这些令人困惑的函数时,是否存在适当的参数类型的规则/约定?或者我应该doc
每次都没有意义地打字?
我认为这取决于.也许核心库实际上最能说明这一点.如果你看一下你引用的例子:
(take n coll) (drop n coll)
在这两种情况下,从语义上讲,最重要的是你要采取/放弃的元素数量.
在类似的情况下,(get coll n)
在具有要获取的索引之前,存在从左到右的语义,首先具有集合.我认为nth
在这方面是一样的.注意,还有其他方法可以从集合中获取索引元素 - 例如,您也可以这样做:
(coll n)
这是有效的,因为clojure数据结构像vector
,hash-map
并且set
都可以充当函数.IMO,这是一种更令人困惑的方式来完成相同的事情,因为它往往更难以阅读,并没有显示意图几乎一样清楚(get coll n)
.
最后,我认为对调用者来说最直观的感觉可能是最好的,并且会使您的代码在未来的代码用户中最易读/可维护.
还有其他考虑因素.例如,变量arity用例(例如,使用& more
),您需要首先需要的参数来防止歧义.我仍然会首先考虑可读性,因为可变参数函数可能带有自己的可读性问题.请参阅Stuart Sierra的这篇精彩文章.