2012-09-14 8 views
12

ho cercato di fare quanto segue in ClojureCome posso mappare una macro in Clojure?

(map future exprs) 

Per ottenere un seguenti del token future. Sfortunatamente questo errore perché future è esso stesso una macro, non una funzione.

C'è un modo per farlo funzionare mantenendo la sintassi map? Preferisco non usare la macro for (solo per questioni di stile personale).

Suppongo che sto cercando una mappa mmap o macro.

+3

Hai provato a usare un lambda? – Marcin

risposta

15

Come già affermato da Marcin, utilizzare una lambda (funzione anonima)

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) 

modificare

A proposito, se si sta utilizzando map per creare un po 'di compiti da eseguire in altri thread, potresti avere problemi. map è pigro e il futuro non verrà creato fino a quando qualcosa non li richiederà. Dovresti forzarlo per essere valutato (che è ciò che accade nel repl quando il repl stampa il risultato) o trovare un altro modo.

+0

... quindi usa 'mapv' invece di' map'? ... '(defn defer [exprs] (mapv # (future%) exprs))' – Thumbnail

+0

Puoi forzare la valutazione con ad es. '(in [] (map # (...) xxx)' Penso che anche il dorun esista anche per questo scopo Non ho il tempo di cercarlo al momento però. – Bill

+5

'doall' è quello che vuoi . 'dorun' dimentica la sequenza mentre la realizza. – Thumbnail