【问题标题】:Is there coding convention for better place of 'coll' and 'n' for Clojure?Clojure 是否有更好的 'coll' 和 'n' 位置的编码约定?
【发布时间】:2016-01-02 07:55:10
【问题描述】:

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

【问题讨论】:

  • 我尝试将“配置”参数放在左边,这样可以更轻松地使用partial
  • @cfrick:您能否在答案中扩展您的评论?我想了解这背后的想法,我从来没有掌握过partial 的窍门,也许这会对我有所帮助。谢谢。
  • @BobJarvis,给定一个带有 n 个参数的函数 f(partial f an-arg) 返回一个带有 n-1 个参数的函数。新函数类似于f,但第一个参数已设置为an-arg。假设我有一个名为xss 的序列序列,并且我想要一个类似但仅包含每个内部序列的前两个元素的新序列。我可以这样做:(map #(take 2 %) xss) 或者我可以使用partial(map (partial take 2) xss)。给partial 更多的参数同样有效。像 cfrick 一样,我尝试将参数放在首位,以便于使用 partial
  • burrown,我不喜欢nth 的语法。我经常在coll 的地方有一个复杂的表达式,而n 通常很简单,但是它被埋在长长的call 表达式的末尾,很难注意到。我也经常在 takenth 之间来回切换,在 repl 处使用相同的参数,这意味着重新排列整个表达式。因此,我经常使用我定义的函数而不是nth,它只是简单地反转nth 的参数。我称之为thn

标签: clojure coding-style conventions


【解决方案1】:

我认为这取决于。也许核心库实际上最好地说明了这一点。如果您查看您引用的示例:

(take n coll) 
(drop n coll)

在这两种情况下,从语义上讲,最重要的是您要取出/丢弃多少元素。

(get coll n) 之类的情况下,有一个从左到右的语义,即先拥有一个集合,然后再拥有一个要获取的索引。我认为nth 在这方面是一样的。请注意,还有其他方法可以从集合中获取索引元素 - 例如,您也可以这样做:

(coll n)

这是可行的,因为像 vectorhash-mapset 这样的 clojure 数据结构都可以充当函数。 IMO,这是一种更令人困惑的方式来完成同样的事情,因为它通常更难阅读,并且不像 (get coll n) 那样清楚地显示意图。

最后,我认为对调用者最直观的感觉可能是最好的,并且将使您的代码对您的代码的未来用户来说最易读/可维护。

还有其他注意事项。例如,可变参数用例(例如使用& more),您需要将所需的参数放在第一位以防止歧义。但是,我仍然会首先考虑可读性,因为可变参数函数可以带有它们自己的可读性问题。请参阅来自 Stuart Sierra 的精彩 post,其中谈到了这一点。

【讨论】:

    【解决方案2】:

    (func ... coll) 格式用于序列库:mapfilterreduce 等。中间的参数通常是函数而不是数字。

    (func coll n) 格式用于从集合中选择元素,nth 用于seqable 集合或get(可以省略)从关联集合中。

    【讨论】:

      猜你喜欢
      • 2012-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-29
      • 2013-12-02
      • 2016-03-10
      • 1970-01-01
      • 2016-02-01
      相关资源
      最近更新 更多