Обойти отсутствие "подъема" в clojure
Я несколько раз обнаружил, что у меня есть группа взаимосвязанных функций, и то, как я, естественно, поместил их в файл, в конечном итоге противоречит их зависимостям (т.е. функция 1 зависит от функции 2, но выше функции 1). Когда я пишу код, я обычно продолжаю оценивать выражения верхнего уровня и оцениваю только весь файл, чтобы обновлять зависимости от ссылок или еще чего-то. Я нахожу это довольно часто, я в конечном итоге столкнулся с конфликтом зависимости, и в конечном итоге придется жонглировать рядом функций.
На других языках, которые я знаю, как только вы объявляете функцию, она становится "поднятой" за кулисами, как будто она появилась раньше всего. Таким образом, вам не нужно беспокоиться о порядке вещей в вашем коде и может рассматривать функции как модульные биты кода. Отсутствие этой функции продолжает укусить меня в clojure. Я делаю что-то неправильно? Его более незначительное раздражение, чем огромная сделка, это то, что вы просто привыкли уделять внимание?
Ответы
Ответ 1
declare
хорошо решает эту проблему
declare
macro
Usage: (declare & names)
defs the supplied var names with no bindings, useful for making forward declarations.
Added in Clojure version 1.0
вы можете избежать манипулирования порядком функций, добавив инструкцию declare к началу своего пространства имен
(declare fun1 fun2 fun3)
(defn fun3 [] (fun1))
(defn fun1 [] (fun2))
(defn fun2 [] 42)