3

我知道我可以从 var 的元数据中获取:lineand ;: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

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

4

1 回答 1

8

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

(defmacro make-thing [obj]
  (let [f *file*]
    (with-meta obj (assoc (meta &form) :file f))))

&form指调用宏的表单,它具有行/列的元数据。特殊的 var文件具有源文件的相对路径。因此,将两者结合到对象上的元数据中会产生所需的结果。

于 2015-06-12T23:06:36.973 回答