Clojure 中的如意算盘

Wishful thinking in Clojure

在Scheme中我习惯做这样的事情

(define (f x) (g x))
(define (g x) (+ x 42))
(g 0)

也就是说,我习惯于根据其他瞬时无界函数来定义函数。 为什么在 Clojure 中这不可能?例如,在 Clojure REPL 上,以下内容无效

(defn f [x] (g x))
(defn g [x] (+ x 42))
(g 0)

问题是每一行都在 repl 中编译,所以在编译 f 时没有 g 函数。您应该在 (defn f... 之前添加 (declare g) 以便编译器知道此函数:

user> (declare g)
#'user/g

user> (defn f [x] (g x))
#'user/f

user> (defn g [x] (+ x 42))
#'user/g

user> (g 0)
42