Видимо, не до конца понимаю суть persistent / transient.
Код 1:
(defn duplicate [s]
(let [result []] ; будем заполнять persistent вектор result
(doseq [e s] ; для каждого элемента вектора s (аргумент)
(println e) ; выводим его на экран
(conj result e e)) ; добавляем два таких элемента в result
result)) ; возвращаем result
(defn -main [& args]
(println (duplicate [1 2 3])))
1
2
3
[]
Код 2:
(defn duplicate! [s]
(let [result (transient [])] ; будем заполнять transient вектор result
(doseq [e s] ; для каждого элемента вектора s (аргумент)
(println e) ; выводим его на экран
(conj! result e) ; добавляем два таких элемента в result
(conj! result e))
(persistent! result))) ; возвращаем persistent result
(defn -main [& args]
(println (duplicate! [1 2 3])))
1
2
3
[1 1 2 2 3 3]
Почему первый код не работает?
Плохо ли в данном случае использование transient?
Можно ли сделать без transient?
Ведь persistent != immutable, так?
В первом коде он, по идее, на каждый вызов conj должен создавать новый вектор (у которого 1 новый элемент, а остальные шарятся между предыдущими версиями вектора).
Почему в итоге возвращает пустой вектор?