動的変数とバインディング関数を理解しようとしたので、これを試しました(clojure 1.3):
user=> (defn f []
(def ^:dynamic x 5)
(defn g [] (println x))
(defn h [] (binding [x 3] (g)))
(h))
#'user/f
user=> (f)
5
nil
混乱して、私はこのやや単純なコードを試しました:
user=> (def ^:dynamic y 5)
#'user/y
user=> (defn g [] (println y))
#'user/g
user=> (defn h [] (binding [y 3] (g)))
#'user/h
user=> (h)
3
nil
2つのコードの違いは何ですか?2番目の例は機能するのに、最初の例は機能しないのはなぜですか?
ヒント:次の作業に気づきました(理由はまだ完全には理解されていません)。
user=> (def ^:dynamic y 5)
#'user/y
user=> (defn f [] (defn g [] (println y)) (defn h [] (binding [y 3] (g))) (h))
#'user/f
user=> (f)
3
nil
user=>