我在Clojure中不喜欢的一件事是我需要按照这样的顺序定义函数:
(defn a [] 1)
(defn b [] (+ 1 (a)))
如果Clojure就像Java那样我可以这样写(无序)。
(defn b [] (+ 1 (a)))
(defn a [] 1)
但是如果我做编译器会抛出 a未定义的错误......
Clojure以这种方式设计的主要原因是什么?
PS:我知道Clojure提供了声明函数,但我不想在命名空间中声明所有函数。我想编写像Java,JavaScript等函数。
答案 0 :(得分:2)
也许你觉得这个小助手很有用
(defmacro autodeclare [& exprs]
(let [dfns# (filter #(and (list? %) (= (first %) 'defn)) exprs)]
(map (fn [e]
`(declare ~(second e))) dfns#)
`(do ~@exprs)))
(autodeclare
(defn c [] (b))
(defn b [] (a))
(defn a [] :a)
(prn :no_defn))
(c)
user> :a