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
在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