Execution error (ClassCastException) at user/generatePermutations (REPL:55).
clojure.lang.PersistentVector cannot be cast to clojure.lang.IAtom
проблема, как говорится в описании ошибки, заключается в том, что вы пытаетесь вызвать swap!
для значения не атома. Чтобы «обновить» вектор, лучше использовать assoc
. Так что, в вашем случае, просто заменив swap!
на assoc
, вы получите его.
вы можете прочитать больше о том, что такое atom
и как его использовать здесь
обновление
приведенный пример показывает мою ошибку: своп! должен был поменять 2 элемента в векторе.
это можно сделать следующим образом:
(defn swap [data-v i j]
(assoc data-v
i (data-v j)
j (data-v i)))
, поэтому ваша начальная функция работает (до некоторой степени):
user> (generatePermutations (vec "rat") 3)
;; rat
;; art
;; tra
;; rta
;; atr
;; tar
Execution error (IndexOutOfBoundsException) at user/swap (REPL:1423).
null
сбой при попытке вызова (swap a 0 3)
.
обновление 2
Другая проблема заключается в том, что вы вызываете (generatePermutations (vec "rat") 3)
, тогда как в java версии вы делаете это с word.length() - 1
. и действительно, (generatePermutations (vec "rat") 2)
дает ожидаемый вами результат.
Хотя сейчас это выглядит правильно, я думаю, это не совсем «закрытый» способ решения такого рода задач.