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

时间:2015-06-12 21:03:35

标签: clojure reader

我知道我可以从var上的元数据中获取:line:file;但是,我正在构建一个系统,用户可以在其中传递原始地图,我将最终“#34;链接"将数据汇集在一起​​。当此链接失败时,我想报告他们指定地图的文件/行。 E.g:

 (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*数据阅读器(这是零),但我似乎无法弄清楚如何访问"代码"阅读器。

1 个答案:

答案 0 :(得分:7)

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

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

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