我正在学习一些Clojure,而我正在使用Quil。我想知道如何将for循环转换为Clojure:
这就是我用Java或类似语言的方式:
for ( int i = 0; i < numSides; i++ ) {
float posX = cos( theta * i );
float posY = sin( theta * i );
ellipse( posX, posY, polySize, polySize );
}
我的Clojure尝试:
(let [theta (/ PI num-sides)
angle (range 0 num-sides)
pos-x (cos (* theta angle))
pos-y (sin (* theta angle))]
(dorun (map #(ellipse % % % %) pos-x pos-y poly-size poly-size)))
答案 0 :(得分:6)
您所寻找的所有方法基本上都是使用序列,其中循环是关于执行特定次数的事情。 Clojure提供dotimes
做一定次数的事情:
(dotimes [i 10]
(println i))
所以你的代码变成了:
(dotimes [i num-sides]
(let [pos-x (cos (* theta i))
pos-y (sin (* theta i))]
(ellipse pos-x pos-y poly-size poly-size)))
答案 1 :(得分:4)
如果你真的想要一个C风格的for
循环,那么我的clojure-utils libray有一个方便的for循环宏,可以让你做类似的事情:
(for-loop [i 0 , (< i num-sides) , (inc i)]
... do stuff.....)
但是,我会发现自己使用以下其中一种方法:
(dotimes [i num-sides] ....)
- 执行特定次数的操作(doseq [x some-sequence] ....)
- 为序列中的每个元素执行某些操作(for [i (range n)] ...)
- 构建包含n个元素的列表答案 2 :(得分:2)
也许这有点学术性,但我喜欢用Clojure的“for comprehension”来表达这种事情。代码如下所示:
(dorun
(for [i (range num-sides)
:let [pos-x (Math/cos (* i theta))
pos-y (Math/sin (* i theta))]]
(quil.core/ellipse pos-x pos-y poly-size poly-size)))
答案 3 :(得分:1)
Doseq
的 range
通常适用于循环特定数量的值以创建副作用。我会按如下方式实现你的循环:
(doseq [i (range 0 num-sides)]
(ellipse (cos (* theta i))
(sin (* theta i))
poly-size
poly-size))