2016-04-10 13 views
3

Clojureでは、名前空間がシンボルをVarsにマップすることが分かりました。私はその後、このClojure特殊フォーム `def`は常に新しいVarを作成しますか?

user=> (def x 3) 
#'user/x 

を言うならば、私は新しいブランドにシンボルxリバウンドしまし

user=> (def x 5) 
#'user/x 
user=> #'x 
#'user/x 
user=> (type #'x) 
clojure.lang.Var  
user=> x 
5 

を今すぐ:だから我々は(ここではデフォルトの名前空間で)このようなヴァールにシンボルxをマッピングすることができますVarまたは私は上記で作成した同じVarの値を更新しましたか?どうすればわかるのですか?

私は、「Javaのフィールド、バース、リファレンス、エージェントはClojureで変更可能です」という文章を読んでいるので、後者だと思っています。 Clojure Reference page on Varsでは、私はそれが証明として保持されているかどうかはわかりません。

+0

あなたの勘違いは、この質問で確認されたようです:http://stackoverflow.com/questions/16447621/difference-between-using-def-to-update-a-var-and-alter-var-root – jmargolisvt

+0

良い発見。 ...私は、PythonやRubyの 'id'のようなものがあることを期待していました。 –

答えて

3

いいえ、defは常に新しいVarを作成するとは限りません。あなたはidentical?を使用してこれを確認することができます

user=> (def x 5) 
#'user/x 
user=> (def v #'x) 
#'user/v 
user=> (def x 3) 
#'user/x 
user=> (identical? v #'x) 
true 
3

Elogentの答えは優れており、受け入れられているが、私はちょうど使用であるかもしれない新しいVARが作成されていないことを証明するために別の方法を見つけた:

user=> (def x 10) 
#'user/x 
user=> (let [y #'x] (println @y) (def x 7) (println @y)) 
10 
7 
nil 

defが新しいvarを作成した場合は、10が2回印刷されているはずです。

関連する問題