ho cercato di capire le variabili dinamiche e la funzione di legame così ho provato questo (clojure 1.3):clojure e ^: dinamica
user=> (defn f []
(def ^:dynamic x 5)
(defn g [] (println x))
(defn h [] (binding [x 3] (g)))
(h))
#'user/f
user=> (f)
5
nil
confuso, ho provato questo codice un po 'più semplice:
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
Cosa è la differenza tra i due pezzi di codice? Perché il secondo esempio funziona ma il primo no?
Suggerimento: Ho appena realizzato che le seguenti opere (ancora non comprendere appieno il motivo):
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=>
Comprendo i pro/contro del binding. Mi rendo anche conto che il primo esempio di codice è un codice clojure insolito. Quello che non ho capito è perché non ha funzionato (con 1.3, nuovo sostituto). – Kevin
Ho difficoltà a vedere quando vorrai legare! Sembra anatema per il modo funzionale. Cosa mi manca? – Hendekagon
@Hendekagon - probabilmente merita una domanda SO a se stante. Ma ho trovato utile come un modo in più di passare il contesto attorno al debugging/working al REPL - se lo facessi in modo puramente funzionale, avresti bisogno di inserire nuovi parametri lungo una chiamata (potenzialmente molto lunga) grafico. – mikera