请在 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则返回true。”这个问题,这类似于and(对于N个参数)但是它宏观上确实有限制,或者every?(对于集合)或者用于创建复合谓词的高阶函数every-pred。根据你的情况,其中之一可能更有意义。

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