Как уже отвечали другие, Clojure векторы неизменны. У вас есть несколько вариантов,
- Использовать переходный вектор.
- Используйте атом.
Используя переходный процесс, ваш код будет выглядеть так:
(let [maze (transient [\* \* \* \*])]
(assoc! maze
1
\#)
(prn (persistent! maze)))
Используя атом, ваш код будет выглядеть так:
(let [maze (atom [\* \* \* \*])]
(prn @maze)
(swap! maze
assoc
1
\#)
(prn @maze))
Это отпечатки,
=> [\* \* \* \*]
=> [\* \# \* \*]
Обратите внимание, что при использовании атома внутренний вектор остается неизменным. Вы меняете вектор новым вектором каждый раз. Так что, если производительность - ваша единственная проблема, используйте transient .
Если вы хотите обновить глубоко вложенную структуру (например, массив массивов), посмотрите на assoc-in
.