绕开缺乏;起重";在clojure

绕开缺乏;起重";在clojure,clojure,hoisting,Clojure,Hoisting,我发现有几次我有一组相互关联的函数,我将如何自然地将它们放在文件中最终与它们的依赖项相冲突(即函数1依赖于函数2,但在函数1之上)。在编写代码时,我通常会不断计算顶级表达式,并且只计算整个文件以刷新对引用或其他内容的依赖关系。我发现经常会出现依赖冲突,最终不得不处理一堆函数 在我所知道的其他语言中,只要你声明一个函数,它就会在幕后被“提升”,就好像它出现在其他任何东西之前一样。这样,您就不必担心代码中的顺序,并且可以将函数视为模块化的代码位。正是由于缺乏这一特点,我在clojure一直感到不安。

我发现有几次我有一组相互关联的函数,我将如何自然地将它们放在文件中最终与它们的依赖项相冲突(即函数1依赖于函数2,但在函数1之上)。在编写代码时,我通常会不断计算顶级表达式,并且只计算整个文件以刷新对引用或其他内容的依赖关系。我发现经常会出现依赖冲突,最终不得不处理一堆函数


在我所知道的其他语言中,只要你声明一个函数,它就会在幕后被“提升”,就好像它出现在其他任何东西之前一样。这样,您就不必担心代码中的顺序,并且可以将函数视为模块化的代码位。正是由于缺乏这一特点,我在clojure一直感到不安。我做错什么了吗?与其说是一件大事,不如说是一件小事,这是你习惯于关注的事情吗?

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)