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

欢迎!有关该功能的更多信息,请查看 关于 页面。

0
语法和读取器
编辑

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

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

我相信 any? 应该接受两个参数,并且如果任何谓词为 true 则返回 true
(def ^{:tag Boolean :doc "如果 (pred x) 对于 coll 中的任何 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 "如果 (pred x) 对于 coll 中的任何 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”的说法,这类似于 and (对于 N 个参数) 但这确实是一个宏的限制,或者 every? (对于集合) 或高阶函数 every-pred 以创建复合谓词。根据你的情况,其中之一可能是有意义的。

头像
明白了,我应该把这个解释转发给 ClojureDocs 吗?
头像
喜欢就好!
头像
非常感谢!
by
没有哪个合格的语文规范委员会会接受一个不等于`(complement not-any?)`的`any?`定义。这是对Clojure治理状况的令人遗憾的是什么一目了然:如果不是永久的,那么自从Smalltalk以来最优秀的语言。
by
Chastie,听上去您从没参与过语言规范委员会的工作。我在ANSI C++委员会工作了八年(三年任其秘书)。规范委员会必须接受各种各样的妥协,就像Alex说的那样,对于某些结构只有有限数量的词可用。
...