2017-05-09 80 views
1

我想分析一个国外clojure代码的文件。我目前使用clojure.tools.reader阅读所有的形式:Clojure代码来分析clojure代码

(require '[clojure.tools.reader :as reader]) 

(defn read-all-forms [f] 
    (let [rdr (indexing-push-back-reader (slurp f)) 
     EOF (Object.) 
     opts {:eof EOF}] 
    (loop [ret []] 
     (let [form (reader/read opts rdr)] 
     (if (= EOF form) 
      ret 
      (recur (conj ret form))))))) 

这通常工作,在遇到指锯齿NS双冒号关键字时除外。例如:

(ns foo 
    (:require [foo.bar :as bar])) 

::bar/baz 

与失败:

ExceptionInfo Invalid token: ::bar/baz

有没有办法使用clojure.tools.reader读取该文件,并解决这样的关键字的方法吗?我应该以某种方式跟踪自己的*alias-map*

回答

3

tools.reader使用clojure.tools.reader/*alias-map*如果绑定,否则它使用(ns-aliases *ns*)来解析别名。因此,如果文件中包含自动解析的关键字,则需要使用其中一种方法来解析自动解析的别名。

+0

谢谢!我结束了'(binding [reader/* alias-map * identity](reader/read ...))''。希望这不是太多的滥用。 (为了我的目的,我不需要准确的别名地图解析。) –