traté de entender las variables dinámicas y función de unión, así que probamos este (clojure 1.3):clojure y ^: dinámico
user=> (defn f []
(def ^:dynamic x 5)
(defn g [] (println x))
(defn h [] (binding [x 3] (g)))
(h))
#'user/f
user=> (f)
5
nil
confundido, me trataron este código algo más simple:
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
Lo Cuál es la diferencia entre las dos piezas de código? ¿Por qué el segundo ejemplo funciona pero el primero no?
Consejo: Me acabo de dar cuenta que las siguientes obras (aún no entienden completamente por qué):
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=>
Entiendo pros/contras de encuadernación. También me doy cuenta de que el primer ejemplo de código es un código clojure inusual. Lo que no entendí es por qué no funcionó (con 1.3, nueva respuesta). – Kevin
¡Tengo problemas para ver cuándo querrías encuadernar! Parece anatema a la manera funcional. Qué me estoy perdiendo ? – Hendekagon
@Hendekagon - probablemente merece una pregunta ASÍ por derecho propio. Pero lo encontré útil como una forma adicional de pasar el contexto mientras depuraba/trabajaba en REPL. Si lo hiciera de manera puramente funcional, necesitaría enhebrar nuevos parámetros durante una llamada (potencialmente muy larga) grafico. – mikera