2010-06-12 15 views
12

Tengo algunos problemas para entender cómo funciona la macro delay en Clojure. No parece hacer lo que se espera que haga (es decir, retrasar la evaluación). Como se puede ver en este ejemplo de código:Evaluación diferida en Clojure

; returns the current time 
(defn get-timestamp [] (System/currentTimeMillis)) 

; var should contain the current timestamp after calling "force" 
(def current-time (delay (get-timestamp))) 

Sin embargo, llamando current-time en el REPL aparece para evaluar de inmediato la expresión, incluso sin haber utilizado el force macro:

user=> current-time 
#<[email protected]: 1276376485859> 
user=> (force current-time) 
1276376485859 

¿Por qué la evaluación de get-timestamp no se retrasó hasta la primera llamada force?

+1

comentario menor: es mejor usar (System/currentTimeMillis) directamente en lugar de construir una Fecha: usan la misma fuente subyacente de milisegundos, pero la primera evita una asignación innecesaria de objetos. – mikera

Respuesta

13

La representación impresa de varios objetos que aparece en el REPL es el producto de un multimétodo llamado print-method. Reside en el archivo core_print.clj en las fuentes de Clojure, que constituye parte de lo que se incluye en el espacio de nombres clojure.core.

El problema aquí es que para la implementación de objetos clojure.lang.IDeref - la interfaz Java para cosas deref/@ pueden operar en - print-method incluye el valor detrás del objeto en la representación impresa. Para este fin, necesita deref el objeto, y aunque se toman medidas especiales para imprimir agentes fallidos y futuros pendientes, los retrasos siempre son forzados.

En realidad, me inclino a considerar esto como un error o, en el mejor de los casos, una situación que necesita una mejora. Como solución temporal, tenga especial cuidado de no imprimir retrasos no forzados.

+0

Por supuesto intentaré que la mejora suceda. Debería ser bastante sencillo. –

+4

Supongo que el Principio de Heisenberg también se aplica a clojure: no se puede observar la demora sin cambiarla. :-) – Greg

+0

@Greg: creo que te refieres al efecto observador. :) https://en.wikipedia.org/wiki/Observer_effect_(physics)#Quantum_mechanics – Peeja

Cuestiones relacionadas