обойти отсутствие "подъема" в clojure - PullRequest
16 голосов
/ 30 марта 2011

Несколько раз я обнаружил, что у меня есть группа взаимосвязанных функций, и то, как я естественным образом поместил бы их в файл, конфликтует с их зависимостями (то есть функция 1 зависит от функции 2, но выше функции 1 ). Когда я пишу код, я обычно продолжаю оценивать выражения верхнего уровня и оцениваю только весь файл, чтобы обновить зависимости от ссылок или еще чего-нибудь. Я нахожу это довольно часто, в результате я сталкиваюсь с конфликтом зависимостей и вынужден манипулировать множеством функций.

На других языках, которые я знаю, как только вы объявляете функцию, она «поднимается» за кулисы, как если бы она появлялась раньше всего. Таким образом, вам не нужно беспокоиться о порядке вещей в вашем коде, и вы можете рассматривать функции как модульные фрагменты кода. Недостаток этой функции постоянно кусает меня. Я делаю что-то неправильно? Это скорее незначительное раздражение, чем огромная сделка, это то, к чему вы просто привыкли обращать внимание?

1 Ответ

23 голосов
/ 30 марта 2011

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 fun1 fun2 fun3)

(defn fun3 [] (fun1))
(defn fun1 [] (fun2))
(defn fun2 [] 42)
...