以下交互是一个实验,因为我试图
了解为什么 tools.analyzer.jvm 在分析这里的 `parse` 函数时抛出异常,特别是它对 `:arglists` 元数据的奇怪定义
定义,具体见 data.xml,尤其是它的值定义
https://github.com/clojure/data.xml/blob/master/src/main/clojure/clojure/data/xml.clj#L107
我使用的是 Ubuntu 18.04 Linux,OpenJDK 11,Leiningen 2.8.1,Clojure
1.9.0,如果这有影响的话。
$ git clone
https://github.com/clojure/tools.analyzer.jvm
$ cd tools.analyzer.jvm
$ git checkout 205f24504c7cc4d0365b8de096470f406eff7ee8
$ lein repl
$ lein repl
;; ... 省略其他输出
user=> (require '[clojure.tools.analyzer.jvm :as j])
nil
user=> (def ^:const parser-opts-arg '{:keys [a b] :or {a true b 5}})
#'user/parser-opts-arg
user=> (defn weird-args-1 {:arglists (list ['source '& parser-opts-arg])} [y] (dec y))
#'user/weird-args-1
user=> (:arglists (meta #'weird-args-1))
([source & {:keys [a b], :or {a true, b 5}}])
user=> (def x (j/analyze+eval '(defn weird-arglists-2 {:arglists (list ['source '& parser-opts-arg])} [x] (inc x))))
#'user/x
user=> (:arglists (meta #'weird-arglists-2))
[(quote source) (quote &) parser-opts-arg]
Var 的 :arglists 元数据的最终值似乎在每个 eval 操作中都会有所不同。
问题