Правильное решение опубликовано rkrishnan.
Что касается этой части вопроса:
Это задумано, или это просто функция читателя Clojureработает?
На самом деле это не имеет ничего общего с ридером Clojure - это потому, что компилятор разрешает символы в Vars сразу же после их обнаружения (в тех позициях, где они должны были бы "в конечном итоге" быть разрешеныVar, в отличие от мест, где они называют местных жителей, цитируются или передаются в специальную форму или макрос, конечно).Это имеет смысл с точки зрения эффективности: знание того, к какому Var относится символ во время компиляции, позволяет генерировать код, который не должен разрешать символы во время выполнения (обычно все еще нужно искать значения в Vars, но не сами Vars).Если бы вы действительно хотели, вы могли бы, чтобы ваш код разрешал символы во время выполнения:
(defn sub1a [a]
(cond
(= a 0) 0
:else ((resolve 'sub1b) (- a 1) )))
(defn sub1b [a]
(cond
(= a 0) 0
:else ((resolve 'sub1a) (- a 1) )))
(println (sub1a 10))
; prints 0 and returns nil
Это, однако, приводит к некоторому снижению производительности, которое вряд ли когда-либо оправдано в реальном коде, поэтому Clojure заставляет вас бытьоткровенно об этом, если вы действительно думаете, что это то, что вы хотите.