OK. He estado jugando con Clojure y continuamente me encuentro con el mismo problema. Vamos a tomar este pequeño fragmento de código:Redefinición de una variable let en dloj Clojure
(let [x 128]
(while (> x 1)
(do
(println x)
(def x (/ x 2)))))
Ahora me esperaba esto para imprimir una secuencia que comienza con 128, como así:
128
64
32
16
8
4
2
En cambio, es un bucle infinito, la impresión de 128 y otra vez. Claramente, mi efecto secundario previsto no está funcionando.
Entonces, ¿cómo se supone que voy a redefinir el valor de x en un bucle como este? Me doy cuenta de que esto puede no ser como Lisp (podría usar una función anónima que recursivamente en sí mismo, tal vez), pero si no descubro cómo configurar una variable como esta, me voy a volver loco.
Mi otra suposición sería usar set !, pero eso da "objetivo de asignación inválido", ya que no estoy en una forma vinculante.
Por favor, infórmeme sobre cómo se supone que esto funciona.
Gracias. Me doy cuenta de que mi camino no era Lispy, ya que los efectos secundarios están mal visto. Estaba pirateando algo (un problema de Project Euler) y no pude hacer funcionar ese sencillo caso de prueba, demostrando que no entendía nada. Gracias por la ayuda. Me olvidé de que el bucle podría ser recurrente, que funciona de manera muy limpia (sin la función adicional haciendo recursividad). – MBCook
Los efectos secundarios son Lispy dependiendo de qué Lisp estés viendo. En Common Lisp te saldrías con (loop para x = 128 then (/ x 2) while (> x 1) do (print x)). Pero los efectos secundarios no son Clojurish. –
Es muy viejo Pero esta es una muy buena respuesta, soy nuevo en Clojure, esto me salvó de horas de luchar con el mismo problema. Muchas gracias @BrianCarper – shan