如何从clj宏访问编译时cljs var元数据?

met*_*ous 5 macros metadata clojure clojurescript

我想构建一个ClojureScript宏(通过Clojure执行/编译),它根据ClojureScript var参数的静态编译时元数据通知它构造一个返回表单.

我知道可以从ClojureScript代码访问编译时静态var元数据(使用(meta (var varsym));参见这篇文章).但是这些数据是否可以通过我们可以从宏访问它的方式访问编译过程?

这是我想要做的粗略草图(问题是你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))
Run Code Online (Sandbox Code Playgroud)

Clo*_*tly 6

为此,您必须使用Clojurescript分析器:

(ns your-macros
  (:require [cljs.analyzer :as cljs]))

(defmacro var-data
  [sym]
  (cljs/resolve-var &env sym))
Run Code Online (Sandbox Code Playgroud)

然后在你的clojurescript文件中:

(ns your-cljs)

(def ^{:foo :bar} xxy {})

(var-data xxy)
Run Code Online (Sandbox Code Playgroud)

元数据将位于:meta地图的关键字中.