El objetivo principal de *read-eval*
es permitir que el lector evalúe una expresión en tiempo de lectura, normalmente para algo que no tiene una notación literal. Si *read-eval*
es verdadero (el valor predeterminado), read
y read-string
evaluará la expresión siguiente # =. Puede ver cómo se usa esa característica cuando *print-dup*
está ligado a verdadero, lo que significa que quiere que los valores se impriman de manera que se conserven sus tipos precisos, en cuyo caso verá que algunos valores se imprimen con # = notación. El valor predeterminado para *print-dup*
es falso; para la mayoría de las cosas, la notación Clojure estándar está bien. Por ejemplo, normalmente no nos importa la distinción entre enteros y largos.
La característica *read-eval*
es útil para cargar código, pero crea un riesgo de seguridad cuando se usa con una entrada que no es de confianza. El consejo habitual antes de Clojure 1.5 era vincular *read-eval*
falso cuando se trata de la entrada del usuario. Sin embargo, todavía hay algunos problemas con la lectura de objetos Java que pueden causar problemas. Eso está arreglado en Clojure 1.5. Más importante aún, Clojure 1.5 introdujo, clojure.edn/read
y clojure.edn/read-string
que no admiten ninguna de las características de *read-eval*
. Son seguros para leer la entrada del usuario que representa los valores habituales de Clojure definidos por el formato EDN. Consulte http://edn-format.org para obtener más información.
Gracias por explicarlo @dAni! Fue muy útil. – murtaza52
El 'eval' confundirá a las personas. El punto es que la expresión después de # = se evalúa cuando '* read-eval *' es verdadero. No es necesario usar eval. – miner49r