在宏扩展中捕获编译器异常

问题描述 投票:0回答:1

我有一个在编译时检查关键正确性的断言:

(defn assert-keys [check-map valid-keys]
  (let [k (set (keys check-map))]
    (when-not (set/subset? k valid-keys)
      (throw (ex-info "Function call contains invalid key." {:submitted-keys k
                                                             :valid-keys     valid-keys})))))

在宏中调用:

(defmacro with-hooks [{:keys [read write] :as options} & body]
  (assert-keys options #{:read :write})
  `(binding [*read-hook*  (or ~read  *read-hook*)
             *write-hook* (or ~write *write-hook*)]
     ~@body))

在这种情况下,它将检查选项映射是否可能包含键

:read
:write
,仅此而已。

问题是,我想为此编写一个测试。如果存在无效的键,该代码将在宏扩展时导致编译器错误。有什么方法可以在测试中捕获此错误吗?

clojure
1个回答
0
投票

您可以使用

macroexpand
。请注意,宏必须是最顶层的形式,因为
macroexpand
不会超出顶层形式。

© www.soinside.com 2019 - 2024. All rights reserved.