4

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)))
4

4 に答える 4

7

あなたが探していたすべての方法は、基本的にシーケンスを操作することです。ループは特定の回数実行することです。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)))
于 2013-03-10T09:58:19.027 に答える
4

本当に C スタイルのforループが必要な場合は、私のclojure-utilsライブラリに、次のようなことができる便利な 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 個の要素を持つリストを作成する
于 2013-03-10T10:26:50.503 に答える
2

これはやや学術的かもしれませんが、私はこの種のことに Clojure の「for Comprehensions」を使用するのが好きです。コードは次のようになります。

(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)))
于 2013-05-24T20:36:36.190 に答える