Clojure:如何获取定义地图的文件/行号?
我知道我可以从变量上的元数据获取Clojure:如何获取定义地图的文件/行号?,clojure,reader,Clojure,Reader,我知道我可以从变量上的元数据获取:行和:文件;然而,我正在构建一个系统,用户可以将原始地图传递给我,我将在稍后将数据“链接”到一起。当这个链接失败时,我想报告他们在其中指定映射的文件/行。例如: (defn generate-stuff [] (make-thing { :k (make-thing { :k v }) })) (link (generate-stuff) (other-generator)) ;; outputs file/line of the map con
:行
和:文件
;然而,我正在构建一个系统,用户可以将原始地图传递给我,我将在稍后将数据“链接”到一起。当这个链接失败时,我想报告他们在其中指定映射的文件/行。例如:
(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行号的定义,但它需要一个读卡器,虽然我可以找到所有的特殊读卡器和
*默认数据读卡器fn*
数据读卡器(为零),但我似乎不知道如何访问“code”读卡器。好的,看起来在宏中使用&form
就是答案。我编写了以下通用测试代码,它似乎可以工作:
(defmacro make-thing [obj]
(let [f *file*]
(with-meta obj (assoc (meta &form) :file f))))
&form
引用调用宏的表单,它具有行/列的元数据。特殊的var文件具有源文件的相对路径。因此,将这两者结合到对象的元数据中会得到所需的结果