用于测试“自我评估”的单个谓词Clojure 中的原子

发布于 2024-11-18 01:49:13 字数 389 浏览 2 评论 0原文

Clojure 的主页上,有以下声明:

字符串、数字、字符、true、 false、nil 和关键字的计算结果为 他们自己。

是否有一个组合谓词可以测试其中的任何一个,组合 string?number?char?true?< /code>、false?nil?keyword?。我应该只使用 (补码吗?) 吗?

At the home site of Clojure, there is the following statement:

Strings, numbers, characters, true,
false, nil and keywords evaluate to
themselves.

Is there a single combined predicate that tests for any of these, combining string?, number?, char?, true?, false?, nil?, and keyword?. Should I just use (complement symbol?)?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

说好的呢 2024-11-25 01:49:13

也许我遗漏了一些东西,但您可以使用以下内容来测试任何这些条件,如果条件成立则返回 true:

(defn self-eval?
  [x]
  (or (string? x)
      (number? x)
      (char? x)
      (keyword? x)
      (true? x)
      (false? x)
      (nil? x)))

Maybe I'm missing something, but you could use the following to test for any of those conditions and return true if one is true:

(defn self-eval?
  [x]
  (or (string? x)
      (number? x)
      (char? x)
      (keyword? x)
      (true? x)
      (false? x)
      (nil? x)))
微暖i 2024-11-25 01:49:13

编写一个询问“给定表达式的计算结果是否为自身”的宏是很容易的。事实上,这是只能使用宏完成的任务的一个很好的例子,因为它们需要查看已计算和未计算的参数。

(defmacro selfp [a] `(= ~a (quote ~a)))
#'user/selfp
user> (selfp 1)
true
user> (selfp +)
false
user> (selfp [1 2])
true
user> (selfp '(+ 1 2 3))
false

虽然字符串、数字、字符、关键字和布尔值都是自评估的,但其他诸如 [1 2] 之类的东西也是如此,所以这通常不是一个有用的测试。

It's easy enough to write a macro that asks "does the given expression evaluate to itself". In fact this is a good example of tasks that can only be done with a macro because they need to see the argument both evaluated and unevaluated.

(defmacro selfp [a] `(= ~a (quote ~a)))
#'user/selfp
user> (selfp 1)
true
user> (selfp +)
false
user> (selfp [1 2])
true
user> (selfp '(+ 1 2 3))
false

While strings, numbers, characters, keywords, and the booleans are all self-evaluating, other things such as [1 2] are as well,so this may not be a useful test in general.

自由如风 2024-11-25 01:49:13

另一种选择是创建一个使用映射的函数:

(defn myclassifier? [x]
   (let [types-I-care-about #{java.lang.Sring ...}]
      (if (types-I-care-about (type x))
          true
          false)))

可能具有更好性能的另一种选择是使用 java 的动态性:

(extend-type Object
  IMyClassifier
  (myclassifier? [x]
            (let [c (.getClass x)]
             (if (types-I-care-about (type c))
               (do
                 (extend-type (.getClass x)
                   IMyClassifier
                   (myclassifier? [x] true))
                 true)
               false))))

其中 types-I-care-about 是您关心的一组类型。

Another option is to create a function that uses a map:

(defn myclassifier? [x]
   (let [types-I-care-about #{java.lang.Sring ...}]
      (if (types-I-care-about (type x))
          true
          false)))

Another option which may have better performance is to use java's dynamism:

(extend-type Object
  IMyClassifier
  (myclassifier? [x]
            (let [c (.getClass x)]
             (if (types-I-care-about (type c))
               (do
                 (extend-type (.getClass x)
                   IMyClassifier
                   (myclassifier? [x] true))
                 true)
               false))))

where types-I-care-about is a set of types you care about.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文