【发布时间】:2018-05-09 18:21:26
【问题描述】:
我需要创建一个循环,在第一步中应该计算一些东西,并且应该将计算的结果传递给测试条件。是这样的:
在(条件)时做(某事)
这是强制性的,第一次通过应该在测试条件发生之前进行计算。
在 Clojure 中可以做到吗?
我在 StackOverflow 上发现了类似的问题,但我不清楚。此处介绍的这些解决方案要精确得多。
【问题讨论】:
我需要创建一个循环,在第一步中应该计算一些东西,并且应该将计算的结果传递给测试条件。是这样的:
在(条件)时做(某事)
这是强制性的,第一次通过应该在测试条件发生之前进行计算。
在 Clojure 中可以做到吗?
我在 StackOverflow 上发现了类似的问题,但我不清楚。此处介绍的这些解决方案要精确得多。
【问题讨论】:
可能是这样的:
(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
init-state 是你正在循环的状态,do-something 是一个计算下一个状态的函数,condition 是一个根据状态返回布尔值的函数。
这是一个纯粹的函数式 do-while-loop,条件被测试在下一个状态被计算出来。如果您愿意,您可以随时使用宏在其之上添加额外的语法糖。
【讨论】:
我会在这里使用loop。每当您无法决定要如何循环时,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 检查是否应该再次循环。
您甚至可以取消 loop 并使用递归函数:
(defn func []
(let [result (some-calc)]
(if (verify-result result)
(recur)
result)))
【讨论】:
let 里面loop。
let [temp_val (blablabla)]let [some_number (blablabla)]let [result (/ (* 2 temp_val) some_number)
let:(let [temp-val (stuff) some-num (stuff) result (/ (* 2 temp-val) some-num)] result)。