在clojure中缺乏“吊装”

时间:2011-03-30 18:08:32

标签: clojure hoisting

我发现有几次我有一组相互关联的函数,我怎么自然地将它们放在文件中最终与它们的依赖项冲突(即函数1依赖于函数2,但是高于函数1 )。当我编写代码时,我通常会继续评估顶级表达式,并且只会评估整个文件以刷新refs或诸如此类的依赖关系。我经常发现,我最终会遇到依赖冲突,并最终不得不兼顾各种功能。

在其他语言中,我知道,只要你声明一个函数,它就会在幕后“悬挂”,好像它出现在其他任何东西之前。这样您就不必担心代码中的事物顺序,并且可以将函数视为代码的模块化位。缺乏这个功能让我一直在咬我。难道我做错了什么?它是一个小麻烦,然后是一个巨大的交易,这是你只是习惯于注意的东西?

1 个答案:

答案 0 :(得分:23)

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)