我有一个在编译时检查关键正确性的断言:
(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
,仅此而已。
问题是,我想为此编写一个测试。如果存在无效的键,该代码将在宏扩展时导致编译器错误。有什么方法可以在测试中捕获此错误吗?
您可以使用
macroexpand
。请注意,宏必须是最顶层的形式,因为 macroexpand
不会超出顶层形式。