Clojure: почему функция должна быть «объявлена», если она вызывается до определения в исходном коде

В Clojure, если вы вызываете функцию до ее определения, например,

(foo (bar 'a))

(defn bar [] ...)

это не скомпилировано. Надо добавить

(declare bar)

до(foo (bar 'a)), Почему Clojure разработан так? Я имею в виду, что в большинстве языков, кроме C / C ++, таких как Java, Python, PHP, Scala, Haskell или даже других Лиспах, особенно в языках динамического типа, объявление функции не требуется, то есть определение функции может быть помещено либо до или после звонка. Мне неудобно пользоваться.