その関数をどのように呼びますか? セットを渡しているように見えるため、一時的なバージョンもセットになり、assoc
連想データ構造とベクトルで動作するため、どの関数でも使用できません。
user=> (assoc #{} :a 1)
ClassCastException clojure.lang.PersistentHashSet cannot be cast to clojure.lang.Associative clojure.lang.RT.assoc (RT.java:691)
user=> (assoc! (transient #{}) :a 1)
ClassCastException clojure.lang.PersistentHashSet$TransientHashSet cannot be cast to clojure.lang.ITransientAssociative clojure.core/assoc! (core.clj:2959)
; the following works as it uses maps and vectors
user=> (assoc {} :a 1)
{:a 1}
user=> (assoc! (transient {}) :a 1)
#<TransientArrayMap clojure.lang.PersistentArrayMap$TransientArrayMap@65cd1dff>
user=> (assoc [] 0 :a)
[:a]
それでは、コード自体について説明してみましょう。コードをたどって、達成したいことについてのヒントがなければ、実際の目標を理解しようとするのは少し難しいですが、一般的なコメントとしては:
times
まったく使用しない入力パラメーターがあります
一時的な突然変異の結果を使用することになっていますが、一時的な突然変異がその場で突然変異するとは想定していません
可能であればトランジェントを避けてください。これらはパフォーマンスの最適化のみを目的としています
実際に返され、結果の位置として使用したいように見えるため、バインディング_current (/ _count 2)
はおそらくあなたが望むものではありません(/ 5 2)
5/2
のような定数はバインディング_count
の一部である必要はありませんloop
。外側を使用して、let
反復ごとにそれらを渡す必要がないようにすることができます
関数内のものに名前を付けるlet
代わりに使用するdef
(if ((rem 1 2) = 0))
あなたが望むものではないことは間違いありません
ここで、シャッフル アルゴリズムはさておき、シーケンスを再配置する必要がある場合は、新しい位置のシーケンスを作成するだけmap
で、元のカードとペアを作成し[position card]
、最後reduce
に元のシーケンスを使用して新しい位置にカードを配置することでそれらを作成できます。シードとして:
(defn generate [coll] ; counts down from (count coll) to 0, change to
; implement your shuffling algorithm
(range (dec (count coll)) -1 -1))
(defn mongean [cards times]
(let [positions (generate cards) ; get the new positions
assemble (fn [dest [pos card]] ; assoc the card at the wanted position
(assoc dest pos card))]
(reduce assemble cards (map vector positions cards))))
単にシャッフルしたい場合:
(defn mongean [cards times] (shuffle cards))