2012-09-14 23 views
12

he tratado de hacer lo siguiente en Clojure¿Cómo puedo mapear una macro en Clojure?

(map future exprs) 

Para obtener una ss de los futuros fichas. Desafortunadamente, esto es erróneo porque future es en sí mismo una macro, no una función.

¿Hay una manera de hacer este trabajo, manteniendo la sintaxis map? Prefiero no usar la macro for (solo como una cuestión de estilo personal).

supongo que estoy buscando un mapa mmap o macro.

+3

¿Ha intentado utilizar un lambda? – Marcin

Respuesta

15

Como ya se ha dicho por Marcin, use un lambda (función anónima)

user=> (map and [true false 0 nil]) 
java.lang.Exception: Can't take value of a macro: #'clojure.core/and (NO_SOURCE_FILE:1) 
user=> (map #(and %) [true false 0 nil]) 
(true false 0 nil) 

edición

Por cierto, si usted está utilizando map para crear un grupo de tareas para ser ejecutado en otros hilos, es posible que tenga problemas. map es flojo, y los futuros no se crearán hasta que algo los solicite. Debería forzarlo a que se evalúe (que es lo que sucede en el repl cuando el repl imprime el resultado) o buscar de otra manera.

+0

... así que use 'mapv' en lugar de' map'? ... '(defn aplazar [exprs] (# mapv (futura%) exprs))' – Thumbnail

+0

Puede forzar la evaluación con, por ejemplo, en '(En [] (mapa # (...) xxx)' pienso que también existe doRun para este propósito también. No tienen el tiempo para mirar hacia arriba en el momento, sin embargo – Bill

+5

. 'Doall' es lo que quiere .' dorun' olvida la secuencia cuando se da cuenta. – Thumbnail

Cuestiones relacionadas