2012-05-05 6 views
4

シンプルなコードを抽象化してループ/マップ/構造体にする方法がわかりません。clojure:ループを使ってものをベクトルに正しく渡しますか?

(let  
    [recipe [1 1 2] 
    voicing [0 2 4] 
    counts (range (count voicing)) 
    scale C] 
    (map vector 
     (make-scale recipe voicing scale 0) 
     (make-scale recipe voicing scale 1) 
     (make-scale recipe voicing scale 2) 
    ) 

出力は次のとおりです:私は基本的に「(マップのベクトルARG1のARG2を使用してい

([:C :E :G] [:D :F :B] [:E :A :C] [:G :B :D] [:A :C :F] [:B :E :G] [:D :F :A]) 

私はそれが私が欲しいの出力を与えるという意味で、動作する次のコードを持っています...) "3 seqsをインターリーブするための呼び出し。

明らかに、make-scaleへの重複呼び出しを削除する最後のステップを行う必要があります。問題は、私は必要、次のとおりです。

(map vector arg1 arg2 arg2) 

と私は私の配列のループの結果を出すループを使用する方法を知っているすべての方法:

(map vector (arg1 arg2 arg3)) 

intialをリファクタリングするための最良の方法です何私はmake-scaleへの単一の関数呼び出ししか持たないようにします。

答えて

3

私はあなたが探していると思う:

一般に
(apply map vector (map (partial make-scale recipe voicing scale) [0 1 2])) 

あなたは配列を有し、かつ、関数の連続した引数としてその要素を使用したい時はいつでも、applyができます。あなたはまた、(この場合にはvector引数はmapへの最初のargmentとして付加されます。)リストにいくつかの引数を付加することができClojureの多くのSTDLIB機能で

が展開されたリスト(vectorと実質的にすべての他のコレクションのコンストラクタ、strを期待しています。 )私はこれが設計によるものだと思います。applyを使用すると予想されます。

もちろん、適用される関数が怠惰な無限引数リストを処理する場合、問題のシーケンスは無限(つまり、無限の無限)でもかまいません。

(take 7 (apply concat (cycle [[1 2 3]]))) 
>>> (1 2 3 1 2 3 1) 
+0

が、これは、私が行方不明になったまさにです、どうもありがとうございました:これはconcatは、リストの無限のリストに適用されているにもかかわらず、正常に動作します。 –

+0

@PaulSanwald待って、ちょうど始まった!私はClojureの 'apply'をlooove :) –

+0

ええ、答えは今でも良いです:)。私が理解していなかった別のことは、あなたが議論を前に置くことができるということでした。 –

関連する問題