我想构建一个ClojureScript宏(通过Clojure执行/编译),它根据ClojureScript var参数的静态编译时元数据通知它构造一个返回表单。
我知道可以从ClojureScript代码访问编译时静态var元数据(使用(meta (var varsym))
;请参阅this post)。但是这些数据是否可以通过我们可以从宏访问它的方式访问编译过程?
这是我想要做的事情的粗略草图(问题实际上是你如何在下面写get-meta-for-varsym
):
;; executed/compiled in clj, targeting cljs
(defmacro themacro
[varsym & args]
(let [var-meta (get-meta-for-varsym varsym)
return-form (compile-return-form-from-metadata var-meta args)]
return-form))
答案 0 :(得分:6)
为此你必须使用Clojurescript分析器:
(ns your-macros
(:require [cljs.analyzer :as cljs]))
(defmacro var-data
[sym]
(cljs/resolve-var &env sym))
然后在你的clojurescript文件中:
(ns your-cljs)
(def ^{:foo :bar} xxy {})
(var-data xxy)
元数据将位于地图的:meta
键中。