2017-05-09 131 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 ...))''。希望這不是太多的濫用。 (爲了我的目的,我不需要準確的別名地圖解析。) –