Clojure:如何获取定义地图的文件/行号?

Ton*_* K. 2 clojure reader

我知道我能得到:line并且:file从一个变种的元数据; 但是,我正在构建一个系统,用户可以在其中传递原始地图,最后我会将数据"链接"在一起.当此链接失败时,我想报告他们指定地图的文件/行.例如:

 (defn generate-stuff []
    (make-thing { :k (make-thing { :k v }) }))

 (link (generate-stuff) (other-generator))
 ;; outputs file/line of the map containing the errant :k/v pair
Run Code Online (Sandbox Code Playgroud)

我假设写一个宏来关联文件/行与集合的元数据几乎肯定是要走的路,但由于没有任何"var"可供查看,我不知道从哪里获取行号.我看到了get-line-number的定义,但它需要一个读者,虽然我可以找到所有特殊的读者和 *default-data-reader-fn*数据读取器(这是零),但我似乎无法弄清楚如何访问"代码"读者.

Ton*_* K. 7

好的,看起来&form在宏中使用就是答案.我写了以下一些通用测试代码,它似乎工作:

(defmacro make-thing [obj]
  (let [f *file*]
    (with-meta obj (assoc (meta &form) :file f))))
Run Code Online (Sandbox Code Playgroud)

&form是指调用宏的形式,并且它具有用于行/列的元数据.特殊var 文件具有源文件的相对路径.因此,将两者组合到对象上的元数据会产生所需的结果.