为什么Clojure不允许我们无序地编写函数?

为什么Clojure不允许我们无序地编写函数?,clojure,functional-programming,lisp,clojurescript,Clojure,Functional Programming,Lisp,Clojurescript,Clojure中我不喜欢的一点是,我需要按如下顺序定义函数: (定义a[]1) (定义b[](+1(a))) 如果Clojure像Java,我可以这样写(无序) (定义b[](+1(a))) (定义a[]1) 但若我这样做,编译器将抛出一个错误,a未定义… Clojure以这种方式设计的主要原因是什么? 注:我知道Clojure提供了声明函数,但我不想声明名称空间中的所有函数。我想用Java、JavaScript等语言编写函数。也许你觉得这个小助手很有用 (defmacro自动声明[&ex

Clojure中我不喜欢的一点是,我需要按如下顺序定义函数:

(定义a[]1)
(定义b[](+1(a)))

如果Clojure像Java,我可以这样写(无序)

(定义b[](+1(a)))
(定义a[]1)
但若我这样做,编译器将抛出一个错误,a未定义…

Clojure以这种方式设计的主要原因是什么?


注:我知道Clojure提供了声明函数,但我不想声明名称空间中的所有函数。我想用Java、JavaScript等语言编写函数。

也许你觉得这个小助手很有用

(defmacro自动声明[&exprs]
(让[dfns#(filter#)(and(list?%)(=(first%)'defn))exprs)]
(地图(fn[e]
`(声明第二个e)dfns#)
`(do~@exprs)))
(自动申报
(定义c[](b))
(定义b[](a))
(定义a[]:a)
(prn:无定义))
(c)
用户>:a

Rich Hickey讨论了基本原理。@SamEstep提到的Rich Hickey关于这一点的说明对CL非常困惑:特别是你无法按照他似乎暗示的方式解决CL中的(非)问题。我希望这个问题在到达时会得到解决,无论什么时候。你的意思是:如果Clojure像Lisp…@tfb实际上,基本上是从评论“Clojure像以前的许多Lisp一样,没有很强的编译单元概念。”开始,当CL被用作这些Lisp的代表时。这并不能回答问题。是的,但我想鼓励人们建立自己的解决方案。这在clojure中很容易实现,问题本身已经在评论部分得到了回答。在lisp中,如果deafult行为不能解决问题,您可以构建自己的工具