Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops Clojure-计算后如何检查循环条件?_Loops_Clojure - Fatal编程技术网

Loops Clojure-计算后如何检查循环条件?

Loops Clojure-计算后如何检查循环条件?,loops,clojure,Loops,Clojure,我需要创建一个循环,在第一步中,应该计算一些东西,并将计算结果传递给测试条件。有点像: 在(状态)期间做(某事) 这是强制性的,第一次通过应该在测试条件出现之前进行计算 有可能在Clojure这样做吗 我在StackOverflow上发现了类似的问题,但我不清楚。这里提供的解决方案更加精确。我在这里只使用循环。每当您无法决定如何循环时,loop是一个很好的起点,因为它非常通用。裸骨示例如下所示: (loop [] (let [result (some-calc)] (if (veri

我需要创建一个循环,在第一步中,应该计算一些东西,并将计算结果传递给测试条件。有点像:

在(状态)期间做(某事)

这是强制性的,第一次通过应该在测试条件出现之前进行计算

有可能在Clojure这样做吗


我在StackOverflow上发现了类似的问题,但我不清楚。这里提供的解决方案更加精确。

我在这里只使用
循环。每当您无法决定如何循环时,
loop
是一个很好的起点,因为它非常通用。裸骨示例如下所示:

(loop []
  (let [result (some-calc)]
    (if (verify-result result) ; The condition
      (recur) ; Loop again
      result))) ; Or return the result of the calculation
其中,
some calc
是生产者,
verify result
检查是否应该再次循环

您甚至可以取消
循环
,使用递归函数:

(defn func []
  (let [result (some-calc)]
    (if (verify-result result)
      (recur)
      result)))

也许是这样的:

(ns playground.core)

(defn do-while-loop [init-state do-something condition]
  (loop [state init-state]
    (let [next-state (do-something state)]
      (if (condition next-state)
        (recur next-state)
        next-state))))


playground.core> (do-while-loop 0 inc #(< % 6))
6
playground.core> (do-while-loop 0 inc #(< % 0))
1
(ns playery.core)
(defn do while循环[init state do something condition]
(循环[状态初始化状态]
(让[下一个州(做某件事)]
(如果(条件下一状态)
(重复下一个状态)
(下一个州)
游乐场.core>(边做边循环0 inc.(<%6))
6.
游乐场.core>(边做边循环0 inc.(<%0))
1.
init state是循环的状态,do something是计算下一个状态的函数,condition是基于状态返回布尔值的函数


这是一个纯功能性的do-while循环,在计算下一个状态后测试条件。如果您愿意,您可以使用宏在其上添加额外的语法糖。

好的,这似乎是我的想法的解决方案,但是如果我需要使用具有一些“变量”的计算,该怎么办?例如:(/(*2临时值)一些数字)。我应该把temp\u val和一些数字的定义放在哪里?@Boba\u Fett在
let
循环中。那么它应该是这样的<代码>让[temp_val(blablabla)]
让[some_number(blablabla)]
让[result(/(*2 temp_val)some_number)@Boba_Fett你只需要1
(让[temp val(stuff)some num(stuff)result(/(*2 temp val)some num)])]result)
。不,我只是习惯了:)