Clojure中的一厢情愿
在计划中,我习惯于这样做Clojure中的一厢情愿,clojure,scheme,lisp,Clojure,Scheme,Lisp,在计划中,我习惯于这样做 (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),以便编译器知道此函数: us
(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
为什么REPL不能自动“声明”未定义的函数?这不是更容易吗?@Matteo Rich Hickey在中给出了这种行为的基本原理,基本上可以归结为您希望未定义符号的错误类型:运行时还是编译时?Common Lisp选择运行时错误,Clojure选择编译时错误。@Curtisummers:Common Lisp选择:编译时warnings、后期绑定和运行时错误。CF Matthew Flatt,“顶级无望”。我能找到的最佳参考: