Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure中的一厢情愿_Clojure_Scheme_Lisp - Fatal编程技术网

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,“顶级无望”。我能找到的最佳参考: