首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将宏应用于矢量

将宏应用于矢量
EN

Stack Overflow用户
提问于 2018-08-31 19:28:51
回答 2查看 133关注 0票数 2

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

代码语言:javascript
运行
复制
[:first-name string? :surname string?]

现在我想在cljs.spec.alpha/cat中使用它们。

在普通的Clojure中,我可以编写一个宏,它将使用args对宏进行cons并求值,对吗?但对于ClojureScript来说,这并不容易,因为macros是编译时的野兽,而且eval也是一种不同的东西。

要将参数矢量应用于ClojureScript中的宏,有哪些解决方法?

EN

Stack Overflow用户

发布于 2018-09-01 05:26:05

您的规范是在编译时以符号方式生成的吗?如果是这样的话,也许您可以按照您的建议使用宏。

代码语言:javascript
运行
复制
(ns foo.core)

(defmacro gen-spec []
  `'~(into '[:first-name string?] '[:surname string?]))

(defmacro apply-macro [name args-form]
  `(~name ~@(eval args-form)))

下面是一个使用它的示例

代码语言:javascript
运行
复制
$ clj -m cljs.main
ClojureScript 1.10.339
cljs.user=> (require '[clojure.spec.alpha :as s])
nil
cljs.user=> (require-macros 'foo.core)
nil
cljs.user=> (foo.core/gen-spec)
[:first-name string? :surname string?]
cljs.user=> (foo.core/apply-macro s/cat (foo.core/gen-spec))
{:cljs.spec.alpha/op :cljs.spec.alpha/pcat, :ps [#object[cljs$core$string_QMARK_] #object[cljs$core$string_QMARK_]], :ret {}, :ks [:first-name :surname], :forms [cljs.core/string? cljs.core/string?], :rep+ nil}

请注意gen-spec如何以符号方式构建规范并以引用的形式返回它。

票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52114521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档