Esto podría ser una pregunta tonta, pero:¿El compilador clojure evaluará automáticamente expresiones de literales en tiempo de compilación?
Supongamos que una expresión depende solo de literales, o en otras expresiones que también solo dependen de literales; ¿el compilador evaluará esto en tiempo de compilación?
Supongamos que tengo,
(def a (some-time-consuming-function some-literal))
(def b (some-other-time-consuming-function a))
los dos para b y a ser evaluados por completo en tiempo de compilación, por lo que el usuario no se ve afectada?
EDITAR: Muchas gracias, todas las respuestas fueron muy útiles.
EDITAR 6.6.2011: Resulta que si intenta utilizar esta técnica para calcular previamente una estructura de datos muy grande, es fácil crear archivos de clase demasiado grandes para cargar. En esos casos, desea crear un archivo que se leerá en lugar de un archivo de clase que se cargará. Los macro trucos descritos en estas respuestas solo deben aplicarse como en situaciones en las que el valor de retorno no es una estructura prohibitivamente grande.
El error arrojado es: "java.lang.ClassFormatError: este índice de clase no es válido" Consulte this thread para la discusión de una situación relacionada.
Pensé que las macros podrían ser una forma de evitar esto. Tres preguntas: 1. ¿Cómo hiciste esto? (Pensé en usar la función de Ackerman, y ver en qué punto del proceso noté una desaceleración, pero no sé cuál es la forma más rigurosa de hacerlo). 2. Cuándo se evalúa b - en el momento de la carga ? 3. ¿No se cancelan entre sí los símbolos de comillas sytax? De todos modos, muchas gracias por la respuesta! –
1) Lo probé usando una métrica diferente, a saber, una función que llamó println. El mensaje aparece durante la compilación pero no aparece cuando se carga el espacio de nombres compilado, por lo tanto, se puede concluir que la función no se estaba ejecutando en tiempo de ejecución. 2) El valor asignado a var b se evalúa durante la macroexpansión. 3) Sip. Fue abandonado por error de una iteración anterior. –
Para que quede claro, la respuesta a su pregunta es "no". Es solo que hay formas de lograr tal comportamiento cuando lo desee. –