请问为什么Clojure的
查看源代码,似乎原因与递归和宏的工作方式有关,但我对其内部机制了解不够,无法进行推测。
以下代码仅返回
```clojure (defn foo [] (let [x (atom 0)] (while (< @x 5) (swap! x inc)))) ```
while
宏不返回任何值呢?根据文档,“假设某些副作用将导致测试变为false/nil。” 好吧,所以我们使用swap!
来修改用于测试的原子状态。但是难道我们不能有一个返回值(例如像loop
中一样重复返回),并带有副作用吗?查看源代码,似乎原因与递归和宏的工作方式有关,但我对其内部机制了解不够,无法进行推测。
以下代码仅返回
nil
:```clojure (defn foo [] (let [x (atom 0)] (while (< @x 5) (swap! x inc)))) ```
(let [a (atom 0)]
(while (< @a 10)
(+ 1 @a)
(swap! a inc)))
也就是说,它不会返回(+ 1 @a)
的值,也不会返回while
循环内部的任何其他值或函数。如果我们想要获取通过while
循环计算出的某个值,我们可以使用print
,但这样我们就不能在其他操作中轻松地使用该值。为了返回一个值,我们必须使用第二个原子,如下所示:
(let [a (atom 0)
end (atom 0)]
(while (< @a 10)
(swap! end #(+ 1 %))
(swap! a inc))
@end)
loop
,但是我在过去的一天中已经使用了loop
四次,而且我从来没有使用过while
,所以我想尝试一下。 - Ben