clojure 是否对有关(fns)命名约定的任何作品开放,尤其是将类似通用的 fns 作为部分
is clojure open to whatever works regarding naming conventions (of fns), especially regarding generic-like fns as partials
我对函数式编程和 clojure 还很陌生。我喜欢。
我想知道社区对以下 fn 命名方法的看法:
这种命名方式是否可行,还是出于某种原因需要避免?
示例:
(defn coll<spec>?
"Checks wether the given thing is a collection of elements of ::spec-type"
[spec-type thing]
(and (coll? thing)
(every? #(spec/valid? spec-type %)
thing)))
(defn coll<spec>?nil
"Checks if the given thing is a collection of elements of ::spec-type or nil"
[spec-type thing]
(or (nil? thing)
(coll<spec>? spec-type thing)))
现在 ... 我在其他地方使用 clojure 中的部分应用程序 defrecrod/specs ...
类似这样:
; somewhere inside a defrecord
^{:spec (partial p?/coll<spec>?nil ::widgets)} widgets component-widgets
现在,我为 colls、sets、hash-maps 创建了这个,具有类似通用形式的规范(spec/valid 的内部应用程序?...)并直接应用谓词和分别
而不是
目前我正在与我的同事讨论这是一种体面的、有意义的和有用的方法——因为在 clojure 中这样命名函数至少是有效的——或者社区是否认为这是一种不可行的方法.
我非常希望您对此发表有根据的意见。
这是一个奇怪的命名约定,但是很多项目都使用奇怪的命名约定,因为它们的作者认为它们有帮助。我想如果我阅读你的代码库,变量命名约定可能不会是最让我惊讶的事情。这不是侮辱:每个项目都有一些让我感到惊讶的东西。
但我完全不明白您为什么需要这些特定功能。正如 Sean Corfield 在评论中所说,有很好的规范组合器函数可以从更简单的规范中构建更高级的规范。您可以将 s/valid?
与 s/coll-of
:
结合使用,而不是编写 coll<spec>?
(s/valid? (s/coll-of spec-type) thing)
同样,您可以使用 s/or
和 nil?
得出 coll<spec>?nil
。
(s/valid? (s/or nil? (s/coll-of spec-type) thing))
这显然比仅 coll<spec>?nil
要在每个调用站点上写的更多,因此您可以不理会我的建议。但重点是您可以提取用于定义这些规范的函数,并使用这些规范。
(defn nil-or-coll-of [spec]
(s/or nil? (s/coll-of spec)))
(s/valid? (nil-or-coll-of spec-type) thing)
重要的是,这意味着您可以将 nil-or-coll-of
的结果传递给其他一些需要规范的函数,也许可以从中构建更大的规范,或者尝试符合它。如果您的所有功能都已 s/valid?
融入其中,您将无法做到这一点。
从组合通用函数的角度考虑,而不是为每件你想做的事情从头开始定义一个新函数。
我对函数式编程和 clojure 还很陌生。我喜欢。 我想知道社区对以下 fn 命名方法的看法: 这种命名方式是否可行,还是出于某种原因需要避免?
示例:
(defn coll<spec>?
"Checks wether the given thing is a collection of elements of ::spec-type"
[spec-type thing]
(and (coll? thing)
(every? #(spec/valid? spec-type %)
thing)))
(defn coll<spec>?nil
"Checks if the given thing is a collection of elements of ::spec-type or nil"
[spec-type thing]
(or (nil? thing)
(coll<spec>? spec-type thing)))
现在 ... 我在其他地方使用 clojure 中的部分应用程序 defrecrod/specs ... 类似这样:
; somewhere inside a defrecord
^{:spec (partial p?/coll<spec>?nil ::widgets)} widgets component-widgets
现在,我为 colls、sets、hash-maps 创建了这个,具有类似通用形式的规范(spec/valid 的内部应用程序?...)并直接应用谓词和分别
而不是
目前我正在与我的同事讨论这是一种体面的、有意义的和有用的方法——因为在 clojure 中这样命名函数至少是有效的——或者社区是否认为这是一种不可行的方法.
我非常希望您对此发表有根据的意见。
这是一个奇怪的命名约定,但是很多项目都使用奇怪的命名约定,因为它们的作者认为它们有帮助。我想如果我阅读你的代码库,变量命名约定可能不会是最让我惊讶的事情。这不是侮辱:每个项目都有一些让我感到惊讶的东西。
但我完全不明白您为什么需要这些特定功能。正如 Sean Corfield 在评论中所说,有很好的规范组合器函数可以从更简单的规范中构建更高级的规范。您可以将 s/valid?
与 s/coll-of
:
coll<spec>?
(s/valid? (s/coll-of spec-type) thing)
同样,您可以使用 s/or
和 nil?
得出 coll<spec>?nil
。
(s/valid? (s/or nil? (s/coll-of spec-type) thing))
这显然比仅 coll<spec>?nil
要在每个调用站点上写的更多,因此您可以不理会我的建议。但重点是您可以提取用于定义这些规范的函数,并使用这些规范。
(defn nil-or-coll-of [spec]
(s/or nil? (s/coll-of spec)))
(s/valid? (nil-or-coll-of spec-type) thing)
重要的是,这意味着您可以将 nil-or-coll-of
的结果传递给其他一些需要规范的函数,也许可以从中构建更大的规范,或者尝试符合它。如果您的所有功能都已 s/valid?
融入其中,您将无法做到这一点。
从组合通用函数的角度考虑,而不是为每件你想做的事情从头开始定义一个新函数。