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

欢迎!请参阅 关于 页面获取更多关于它是如何工作的信息。

0
语法和阅读器
编辑

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

not-any? 对比。
(def ^{:tag Boolean :doc "如果有任意 x 属于 coll,使得 (pred x) 是逻辑真,则返回 false,否则返回 true。" :arglists '([pred coll]) :added "1.0"} not-any? (comp not some))

我认为 any? 应该接受两个参数,并在任何谓词为 true 时返回 true
(def ^{:tag Boolean :doc "如果有任意 x 属于 coll,使得 (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 "如果有任意 x 属于 coll,使得 (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 的谓词,所以是的,这是正确的行为。any? 被添加为一个谓词,用于在任意值都有效的情况下与 spec 一起使用。它并不是 not-any? 的补充,尽管这种假设很明显。最后,毕竟只有这么多词,尽管在这方面付出了很多努力,但有时仍然存在这些混淆。

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

我明白了,我应该将这个解释转发到 ClojureDocs 吗?
随意!
非常感谢!
没有一个合格的语言标准委员会会接受将 `any?` 的定义不与 `(complement not-any?)` 等同的。这是对 Clojure 管理状况的一次无奈窥见:自 Smalltalk 以来最失败的最佳语言,如果不是永远的。
Chastie,听起来你从未在语言标准委员会工作过,我在 ANSI C++ 委员会工作了八年(并且担任了三年的秘书)。标准委员会必须接受各种妥协,正如 Alex 所说的,某些结构只有有限的单词可用。
...