首页 > 解决方案 > 将宏应用于向量

问题描述

想象一下有一个动态生成的规范cat

[:first-name string? :surname string?]

现在我想将它们与cljs.spec.alpha/cat.

在普通的 Clojure 中,我可以编写一个宏,它将一个带有 args 的宏 cons 并评估它,对吗?但是对于 ClojureScript 来说,这并不容易,因为它macros是编译时的野兽,而且eval也有点不同。

将我的 args 向量应用于 ClojureScript 中的宏的解决方法是什么?

标签: clojurescriptclojure.spec

解决方案


不幸的是,这对于动态/数据驱动的规范来说并不容易,但这显然正在为未来的版本而努力。

我认为唯一的解决方法是eval使用或使用您提到的 cljs.spec.alpha 内部实现。

cljs.user=> (def cat-args [:x string?])
#'cljs.user/cat-args
cljs.user=> (s/def ::foo (eval (cons 's/cat cat-args)))
:cljs.user/foo
cljs.user=> (s/conform ::foo '("foo"))
{:x "foo"}

推荐阅读