Представьте, что вы использовали номер вместо карты:
user> (def s 3)
#'user/s
user> (= s 3)
true
user> (+ 1 s)
4
user> (= s 4)
false
user> (def s (+ 1 s)) ;;don't do this! changing definitions shouldn't be used in a program, only at the REPL for trying things out!
#'user/s
user> (= s 4)
true
user> (- s 1)
3
user> (= s 4)
В Clojure большинство значений ведут себя как числа. Есть некоторые изменчивые вещи, но они скрыты за загадочными интерфейсами. Без них очень много программирования.
Но как мы можем программировать без изменения переменных? Возможно, вы видели функцию факториала
(defn factorial [n]
(if (< n 2) 1
(* n (factorial (dec n)))))
user> (factorial 5)
120
Вот аналогичная функция, которая создает карту таким же образом
(defn char-map [n]
(if (< n 0) {}
(assoc (char-map (dec n)) n (char n))))
user> (char-map 10)
{various control characters..}
Этот стиль поначалу странный, но со временем становится естественным. Когда я думаю о чем-то, что можно запрограммировать в наши дни, я часто думаю о рекурсивном решении до обязательного цикла.
Это два разных взгляда на одно и то же.
Обычно легко переводить между ними, так что, если вы можете придумать один способ сделать это, вы уже подумали о другом. Но для этого нужно практиковаться, например, научиться говорить по-латыни.
В ясности мыслей и безопасности потоков есть некоторые преимущества, заключающиеся в том, что вещи не меняются после того, как вы их создали. Математики особенно предпочитают это.