はtry
1 つのマクロにありcatch
、最初のマクロによって呼び出される 2 番目のマクロにあります。以下を機能させるにはどうすればよいですか?
(defmacro catch-me []
`(catch ~'Exception ~'ex
true))
(defmacro try-me []
`(try (+ 4 3)
(catch-me)))
エキスパンドtry-me
は良さそうです:
(clojure.walk/macroexpand-all '(try-me))
収量
(try (clojure.core/+ 4 3) (catch Exception ex true))
ただし、(try-me) を呼び出すと、次の結果が得られます。
"Unable to resolve symbol: catch in this context",
ところで、これは、try ではないときに catch を使用するときに REPL で取得するメッセージでもあります。
アップデート:
これは私がそれを機能させる方法です(ありがとう、@Barmar)。ここで私のコードの実際のコンテキストを見ることができます:
(defmacro try-me [& body]
`(try
~@body
~@(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]])))))
しかし、これは私が望んでいたものです(別のマクロを使用catch-me
):
(defmacro try-me [& body]
`(try
~@body
(catch-me com.mongodb.MongoException$Network "Database unreachable.")
(catch-me com.mongodb.MongoException "Database problem.")
(catch-me Exception "Unknown error.")))
これは、作成/保守が簡単になると思います。
何か案は?パラメータを渡しているため、構文の引用が必要です。そのため、残念ながらアーサーの答えを適用できません(または何とかできますか?)が、実際のコンテキストを今まで投稿していませんでした。