Как вы называете эту функцию? Похоже, вы передаете набор, поэтому его переходная версия также будет набором и, следовательно, не может использоваться ни с одной из функций 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))
person
skuro
schedule
24.11.2012