2012-09-14 8 views
12

Ich habe versucht, die folgenden in ClojureWie kann ich ein Makro in Clojure abbilden?

(map future exprs) 

Um ein seq zukünftigen Token zu tun. Leider irrt das, weil future selbst ein Makro ist, keine Funktion.

Gibt es eine Möglichkeit, dies unter Beibehaltung der map Syntax zu erreichen? Ich würde lieber nicht das for Makro verwenden (nur als eine Frage des persönlichen Stils).

Ich nehme an, ich suche nach einer mmap oder Makro-Karte.

+3

Haben Sie versucht, ein Lambda zu verwenden? – Marcin

Antwort

15

Wie bereits von Marcin Angaben gemacht werden, eine Lambda (anonyme Funktion)

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) 

bearbeiten

By the way, wenn Sie map verwenden eine Reihe von Aufgaben zu erstellen ausgeführt werden In anderen Threads könnten Probleme auftreten. map ist faul, und die Zukunft wird nicht geschaffen, bis etwas nach ihnen fragt. Sie müssten erzwingen, dass es ausgewertet wird (was in dem repl passiert, wenn das repl das Ergebnis druckt) oder einen anderen Weg finden.

+0

... also 'mapv' anstelle von' map' verwenden? ... '(defn defer [excrs] (mapv # (zukünftige%) exprs))' – Thumbnail

+0

Sie können die Auswertung mit z. '(in [] (map # (...) xxx)' Ich denke, dass dorun auch für diesen Zweck existiert. Habe aber nicht die Zeit, es im Moment nachzuschlagen. – Bill

+5

'doall' ist was du willst . 'Dorun' vergisst die Reihenfolge, wie sie es realisiert. – Thumbnail

Verwandte Themen