是否有一种线程方式来执行;或;(或任何测试)clojure中的条件?

是否有一种线程方式来执行;或;(或任何测试)clojure中的条件?,clojure,Clojure,大致如下: (或-> “foobar” (clojure.string/start-with?“foo”) (clojure.string/start-with?“bar”)) =>正确 如果不是,使用多个OR/AND执行测试的惯用方法是什么?我在这里使用。它本质上是一种序列友好的或检查,当所有条件基本相同时,可以帮助减少重复: (some #(clojure.string/starts-with? "foobar" %) ["foo" "bar"]) 它使用提前返回 和相当于

大致如下:

(或->
“foobar”
(clojure.string/start-with?“foo”)
(clojure.string/start-with?“bar”))
=>正确
如果不是,使用多个OR/AND执行测试的惯用方法是什么?

我在这里使用。它本质上是一种序列友好的
检查,当所有条件基本相同时,可以帮助减少重复:

(some #(clojure.string/starts-with? "foobar" %)
      ["foo" "bar"])
它使用提前返回


相当于
一些
,应该是
每?

(every? odd? [3 5 9])
=> true

在一般情况下,您确实需要使用
和符号:

(defn check [val]
  (or
    (= val "foobar")
    (clojure.string/starts-with? val "foo")
    (clojure.string/starts-with? val "bar")))

(check "foobar") => true
(check "foosball") => true
(check "barbell") => true
(check "egg-foo-yung") => false

我们需要在所有后续子句中插入第一个参数,然后再对其进行计算。因此,解决方案必须是一个宏。如果我们准备不进行语法检查,我们可以非常简洁地定义它:

(defmacro or-> [arg & pred-exprs]
  (let [insert-expr (fn [[x & xs]] (list* x arg xs))
        inserted-exprs (map insert-expr pred-exprs)]
    (cons 'or inserted-exprs)))
它的工作原理是:

problem=> (or-> "foobar" 
                (clojure.string/starts-with? "foo")
                (clojure.string/starts-with? "bar"))
true

problem=> (or-> "foobar"
                (clojure.string/starts-with? "for")
                (clojure.string/starts-with? "bar"))
false
但是它为每个尝试的子句计算
arg
表单。为了只评估一次
arg
表单,我们为
gensym
插入一个
let
表单:

(defmacro or-> [arg & pred-exprs]
  (let [arg-sym (gensym)
        insert-arg (fn [[x & xs]] (list* x arg-sym xs))
        inserted-exprs (map insert-arg pred-exprs)]
    `(let [~arg-sym ~arg] (or ~@inserted-exprs))))

我很想用auto gensym做这个,但我不知道怎么做。但是,这不是正常Clojure意义上的线程,它总是执行所有线程化子句

另请参阅。我不清楚您是否只需要测试或一些线程功能。看看cond->和cond->。