是否有一个“:直至;像clojure的命令?

是否有一个“:直至;像clojure的命令?,clojure,Clojure,我想执行以下嵌套操作,直到满足Expression。。 是否有一个:until关键字,在条件匹配时停止执行进一步的操作 此命令生成毕达哥拉斯三元组3 4 5。我不想让它做任何其他事情,一旦它得到的数字序列 (for [a (range 1 100) b (range 1 100) c (list (Math/sqrt (+ (Math/pow (int a) 2) (Math/pow (int b) 2)))) :when (= 12 (+ a b c))]

我想执行以下嵌套操作,直到满足Expression。。 是否有一个:until关键字,在条件匹配时停止执行进一步的操作

此命令生成毕达哥拉斯三元组3 4 5。我不想让它做任何其他事情,一旦它得到的数字序列

(for [a (range 1 100)
      b (range 1 100)
      c (list (Math/sqrt (+ (Math/pow (int a) 2) (Math/pow (int b) 2))))
      :when (= 12 (+ a b c))]
     (list a b c))

:而
中针对
表达式的短路测试。列表元素将一直生成,直到第一次遇到失败的测试为止

就你而言

(for [<code omitted> :while (not (= 12 (+ a b c)))] (list a b c))
由于生成了一个序列,您将通过拾取第一个元素获得所需的结果:

(first (for [a (range 1 100)
             b (range 1 100)
             c (list (Math/sqrt (+ (Math/pow (int a) 2) 
                                   (Math/pow (int b) 2))))
             :when (= 12 (+ a b c))]
          (list a b c))
由于懒惰,只计算生成列表的第一个元素,这可以用一个副作用来证明:

user=> (first
        (for [a (range 1 100)
              b (range 1 100)
              c (list (Math/sqrt (+ (Math/pow (int a) 2) 
                                    (Math/pow (int b) 2))))
              :when (= 12 (+ a b c))]
          (do (println "working...")
              (list a b c))))
working...
(3 4 5.0)
(for…
带有:let修饰符,因此无需在列表中包装c:

(for [a (range 1 100)
      b (range 1 100)
      :let [c (Math/sqrt (+ (Math/pow (int a) 2) 
                            (Math/pow (int b) 2)))]
      :when (= 12 (+ a b c))]
  (list a b c))

你就不能“不”条件吗?我从代码中学到了很多。只有几个问题:1.生成什么类型的(用于…)?2.为什么需要(seq xs)?1)一个惰性序列。2) 要检查xs为空时的情况,当xs为空时:(seq xs)将返回nil,从而导致测试失败并退出循环。这是Clojure中相当常见的一个成语。
(for [a (range 1 100)
      b (range 1 100)
      :let [c (Math/sqrt (+ (Math/pow (int a) 2) 
                            (Math/pow (int b) 2)))]
      :when (= 12 (+ a b c))]
  (list a b c))