try
è in una macro, la catch
in una seconda chiamata dal primo. Come ottenere il seguente lavoro?È possibile provare a catturare in macro diverse (ma nidificate)?
(defmacro catch-me []
`(catch ~'Exception ~'ex
true))
(defmacro try-me []
`(try (+ 4 3)
(catch-me)))
Espansione try-me
sembra buono:
(clojure.walk/macroexpand-all '(try-me))
cede
(try (clojure.core/+ 4 3) (catch Exception ex true))
ma chiamando il numero (try-me) i rendimenti:
"Unable to resolve symbol: catch in this context",
che, BTW, è anche il messaggio che si otterrebbe nella REPL quando si usa la presa quando non ci si prova.
UPDATE:
Questo è come posso farlo funzionare (grazie, @Barmar), qui potete vedere il contesto attuale del mio codice:
(defmacro try-me [& body]
`(try
[email protected]
[email protected](for [[e msg] [[com.mongodb.MongoException$Network "Database unreachable."]
[com.mongodb.MongoException "Database problem."]
[Exception "Unknown error."]]]
`(catch ~e ~'ex
(common/site-layout
[:div {:id "errormessage"}
[:p ~msg]
[:p "Error is: " ~e]
[:p "Message is " ~'ex]])))))
ma questo è ciò che ero sperando in (utilizzando una macro separata catch-me
):
(defmacro try-me [& body]
`(try
[email protected]
(catch-me com.mongodb.MongoException$Network "Database unreachable.")
(catch-me com.mongodb.MongoException "Database problem.")
(catch-me Exception "Unknown error.")))
penso che questo sarebbe stato più facile da scrivere/mantenere.
Qualche idea? Ho bisogno di sintassi-quoting perché sto passando dei parametri, è per questo che purtroppo la risposta di Arthur non può essere applicata (o può in qualche modo?), Ma non ho postato il mio contesto attuale fino ad ora.
Il mio attuale ipotesi è che (catch-me) viene prima espanso, prima che sia chiaro che è all'interno di una prova. È così? Come combatterlo? – 0dB
I macro vengono espansi solo nei punti in cui un'espressione viene valutata normalmente. Le sottomasche 'catch' non sono espressioni che vengono valutate, fanno parte della sintassi di' try'. – Barmar
Attualmente ritengo ancora questa domanda come senza risposta. È sconcertante il motivo per cui l'esempio di Arthur funziona, ma uno che usa la sintassi della sintassi non lo fa, e, che macroexpand-all mostra un'espansione della macro funzionante, ma una chiamata diretta ad essa fallisce con un errore. Grazie a Barmar per la soluzione. Qualche altra idea, qualcuno? – 0dB