2024 Clojure 状态调查! 中分享您的想法。

欢迎!有关如何操作的更多信息,请参阅关于 页面。

0 投票
语法和读取器
编辑

Clojure 的 any? 函数似乎总是返回 true
(defn any? "返回任何参数时的真。" {:tag Boolean :added "1.9"} [x] true)

not-any? 对比。
(def ^{:tag Boolean :doc "如果在 coll 中的任何 x 上 (pred x) 为逻辑真,则返回 false,否则返回 true。" :arglists '([pred coll]) :added "1.0"} not-any? (comp not some))

我认为 any? 应该接受两个参数,并在任何谓词为 true 时返回 true
(def ^{:tag Boolean :doc "如果在 coll 中的任何 x 上 (pred x) 为逻辑真,则返回 true,否则返回 false。" :arglists '([pred coll]) :added "1.9"} any? (comp boolean some))
感谢 ClojureDocs 上的 Kofrasa。

以下是一些要运行的测试

`
(ns user
(:require [clojure.test :refer [are deftest]]

        [clojure.test.check.clojure-test :refer [defspec]]
        [clojure.test.check.generators :as gen]
        [clojure.test.check.properties :as prop])

(:refer-clojure :exclude [any?]))

(deftest clojure-any
(are [x y] (= ((comp boolean some) true? x) (clojure.core/any? y))

[true] true
[false] false ;; this fails
[true true] true
[false true] true
[false false] false ;; so does this
))

(def
^{:tag Boolean
:doc "如果在 coll 中的任何 x 上 (pred x) 为逻辑真,则返回 true,否则返回 false。"
else false."
:arglists '([pred coll])
:added "1.9"}
any? (comp boolean some))

(defspec correct-any 1000
(prop/for-all [v (gen/such-that not-empty (gen/vector gen/boolean))]

            (= ((comp boolean some) true? v)
               (any? true? v)
               (not (not-any? true? v)))))

`

格式混乱,对此表示歉意。
https://gist.github.com/wildwestrom/9568e9c659d30a2a663a9a0a8235a6b9

1 个答案

+1 投票

any? 是一个始终返回 true 的谓词,所以是的,这是正确的行为。《code>any? 被作为谓词添加到与 spec 一起使用的情况,其中任何值都有效。它不是 not-any? 的补充,尽管有这种明显的假设。最终,只有那么多单词,尽管在这方面非常小心,但有时这些混淆仍然存在。

关于“我认为 any? 应该接受两个参数,如果任何谓词为真则返回 true”,这与 and(对于 N 个参数)类似,但这确实有限制作为一个宏,或者 every?(对于集合),或者创建复合谓词的高阶函数 every-pred。根据你的情况,这三个中可能有一个是有意义的。

明白了,我应该把这份解释转发给 ClojureDocs 吗?
如果你喜欢的话!
非常感谢!
任何合格的语言标准化委员会都不会接受`any?`的定义,如果它不等于`(complement not-any?)`。这是对Clojure治理状况的一个不愉快的窥视:如果不是永远地,那么这是自Smalltalk以来最糟糕的语言。
听起来你从来没有在语言标准化委员会工作过,Chastie?我在ANSI C++委员会工作了八年(并且是其秘书三年)。标准委员会不得不接受各种各样的妥协,正如Alex所说,用于某些构造的单词数量是有限的。
...