2016-05-05 11 views
4

に私がいるこの希望的観測は、スキームではClojure

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

ような何かをするために使用された、私は他のmomentaneously無制限の機能の面で関数を定義するために使用されました。 なぜClojureではこれができないのですか? ClojureのREPLで、例えば、以下の事がREPLでコンパイルされているすべての行である

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

答えて

11

有効ではありませんので、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 
+3

なぜREPLが自動的に未定義の機能を「宣言」しないのですか?それは簡単ではないでしょうか? – Matteo

+9

@Matteo Rich Hickeyは[このHNコメント](https://news.ycombinator.com/item?id=2467809)でこの動作の根拠を示しています。これは基本的にどのような種類のエラー未定義のシンボル:ランタイムまたはコンパイル時間? Common Lispは実行時エラーを選択しますが、Clojureはコンパイル時エラーを選択します。 –

+4

@CurtisSummers:Common Lispは、コンパイル時の警告、遅延バインディング、およびランタイムエラーを選択します。 –