Die try
ist in einem Makro, die catch
in einer zweiten, die von der ersten aufgerufen wird. Wie bekomme ich das Folgende zur Arbeit?Kann versuchen, in verschiedenen (aber verschachtelten) Makros zu sein?
(defmacro catch-me []
`(catch ~'Exception ~'ex
true))
(defmacro try-me []
`(try (+ 4 3)
(catch-me)))
try-me
Erweiterung sieht gut aus:
(clojure.walk/macroexpand-all '(try-me))
ergibt
(try (clojure.core/+ 4 3) (catch Exception ex true))
aber Aufruf (try-me) ergibt:
"Unable to resolve symbol: catch in this context",
die, BTW, ist auch die Nachricht, die Sie in der REPL bekommen würden wenn Sie Fang verwenden, wenn Sie nicht versuchen.
UPDATE:
Dies ist, wie ich es (danke, @Barmar) zu arbeiten bekommen, hier können Sie den aktuellen Kontext meines Codes sehen:
(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]])))))
aber das ist, was ich Hoffnung auf (ein separates Makro catch-me
verwenden):
(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.")))
ich denke, das wäre einfacher zu schreiben/aufrechtzuerhalten.
Irgendwelche Ideen? Ich brauche Syntax-Quoting, weil ich Parameter übergebe, deshalb kann Arthurs Antwort leider nicht angewendet werden (oder kann es irgendwie?), Aber ich habe meinen aktuellen Kontext erst jetzt gepostet.
Meine aktuelle Vermutung ist, dass (Catch-me) wird zuerst erweitert, bevor es klar ist, dass es sich in einem Versuch befindet. Ist es das? Wie man das bekämpft? – 0dB
Makros werden nur an Stellen erweitert, an denen ein Ausdruck normal ausgewertet würde. Die 'catch'-Teilformulare sind keine Ausdrücke, die ausgewertet werden, sie sind Teil der Syntax von' try'. – Barmar
Ich halte diese Frage derzeit noch für unbeantwortet. Es ist verblüffend, warum das Beispiel von Arthur funktioniert, aber eines, das Syntax-Quoting verwendet, und das Makroexpand-all zeigt eine funktionierende Makroerweiterung, aber ein direkter Aufruf an es schlägt mit einem Fehler fehl. Danke an Barmar für die Problemumgehung. Irgendwelche anderen Ideen, irgendjemand? – 0dB