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

时间:2016-12-21 14:40:07

标签: clojure functional-programming lisp clojurescript

我在Clojure中不喜欢的一件事是我需要按照这样的顺序定义函数:

(defn a [] 1)
(defn b [] (+ 1 (a)))


如果Clojure就像Java那样我可以这样写(无序)。

(defn b [] (+ 1 (a)))
(defn a [] 1)

但是如果我做编译器会抛出 a未定义的错误......

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

PS:我知道Clojure提供了声明函数,但我不想在命名空间中声明所有函数。我想编写像Java,JavaScript等函数。

1 个答案:

答案 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