18

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

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

4

1 回答 1

25

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)
于 2011-03-30T18:25:49.827 回答