clojure - microsoft - visual studio installer
Clojure: dejar que el alcance y la función devuelvan valor (2)
Tengo algunos problemas para saber cómo usar el formulario "dejar". En el ejemplo siguiente, me gustaría vincular localmente el valor "cols" para trabajar más adelante en la función. Lo que estoy notando, sin embargo, es que si uso "let" la función sel-opt-tmp devolverá un valor nil en lugar de una lista.
(defn sel-opt-tmp []
(let [cols "test"]))
(prn (sel-opt-tmp))
* El código anterior devuelve un valor nulo.
Entiendo que "let" solo vincula un valor en el alcance de una función, lo que no sé es si hay una manera de pasar el valor fuera del alcance de let. Tal vez hay algo así como "retorno" que no tengo conocimiento? ¿O es simplemente un mal diseño y no debería usar el enlace en este caso (esto tiende a crear largas cadenas de funciones que son difíciles de leer, sin embargo)?
No hay tal problema con pasar valores fuera del alcance como usted menciona. Las cols
vinculación están vigentes solo dentro del alcance, pero la duración del valor de (:ks cols)
no está restringida de manera similar. (Es por eso que tiene recolección de elementos no utilizados: puede devolver valores que apuntan a datos, y los datos se mantienen en vivo siempre y cuando haya referencias a ellos).
Si obtienes nil de la función, eso probablemente significa que cols
no tiene una tecla :ks
... o de hecho podría no ser un mapa. Como cols
es el resultado del filter
, es una secuencia, y cuando la palabra clave :ks
se usa como una función, devuelve nil para las no colecciones. Para protegerse contra ese tipo de errores, puede ser una convención útil escribir siempre (cols :ks)
lugar de (:ks cols)
para que obtenga un error cuando lo que cree que es un mapa es otra cosa.
Devuelve nil porque el contenido de la instrucción let está vacío (o nulo). Tratar:
(let [cols "test"] cols)
Lo cual devolverá el valor de cols
. Como dice seh, una instrucción let evalúa el valor de su última sub-expresión.