6

私はClojureの初心者です。私はカードスーツのベクトルの2つのコピーを取得しようとしています。私が思いつくことができる非DRYの方法は

(def suits [:clubs :diamonds :hearts :spades])
(def two-times (concat suits suits))

より機能的な方法が必要です(より多くの文字が必要な場合でも:-))。N回欲しい場合はどうなりますか?助言がありますか?

私が試みるすべてのこと、

(replicate 2 suits)

結果は2つの別々のベクトルになります。

([:clubs :diamonds :hearts :spades] [:clubs :diamonds :hearts :spades])

構造を「平らにする」にはどうすればよいですか?

4

4 に答える 4

8

concat遅延シーケンスを提供します。代わりに (非遅延) ベクトルを使用する場合:

user> (into suits suits)
[:clubs :diamonds :hearts :spades :clubs :diamonds :hearts :spades]
user> (reduce into (replicate 2 suits))
[:clubs :diamonds :hearts :spades :clubs :diamonds :hearts :spades]

これにインデックスで何度もアクセスしているか、それを反復処理しているかに応じて、ベクトルまたは seq のいずれかがより適切な場合があります。

cycle繰り返される要素の無限の(怠惰な)ストリームが必要な場合は、常にあります:

user> (take 9 (cycle suits))
(:clubs :diamonds :hearts :spades :clubs :diamonds :hearts :spades :clubs)
于 2010-04-23T19:06:57.060 に答える
2

(テストされていません!)

(apply concat (repeat 2 suits))

うまくいけば、トリックを行います。

concatもちろん、2つのリストを連結します。apply評価のために、特定の関数を既存のリストの先頭の位置に密輸するために使用できます。

于 2010-04-23T18:37:34.887 に答える
2

REPLを少し実験して、この解決策にたどり着きました。

user=> (def suits [:clubs :diamonds :hearts :spades])
#'user/suits
user=> suits
[:clubs :diamonds :hearts :spades]    
user=> (reduce concat (replicate 2 suits))
(:clubs :diamonds :hearts :spades :clubs :diamonds :hearts :spades)
于 2010-04-23T18:46:37.443 に答える
1
(take (* 2 (count suits)) (cycle suits))
于 2010-04-24T18:02:46.163 に答える