私は現在ANTLRとClojureを貼り合わせており、ANTLRが返す抽象構文ツリー上にClojureジッパーを作成しようとしています。Javaオブジェクトツリー上に作成されたClojureジッパーをzip-filterで使用できますか?
ASTは非常にJava風味のオブジェクトセットで、CommonTreeオブジェクトを使用して階層を表します。
次のように私はCommonTree以上のジッパーを作った:
(defn branch? [tn] (not (zero? (.getChildCount tn))))
(defn children [tn] (.getChildren tn))
(defn make [tn children] (doto (CommonTree. tn)
(.addChildren children)))
(defn zip-parse [f] (z/zipper branch? children make (parse f)))
(私はCommonTreeがそのようにノード作りが機能することを100%わからないんだけど、私はまだそれを確認する十分もらっていません。 ...)
私はこのように、これらの関数を使用します。
(def zip-ast (parse testfile))
これまでのところ、とても良いです。これは実際に動作します。私は、 "下"、 "右"、 "左"、 "上"の機能でナビゲートすることができます。私は特定のトークンを見つけるためにジップフィルタライブラリを使用しようとすると問題が発生:
(defn token [loc] (-> loc z/node .getToken .getText))
(defn token= [tokenname]
(fn [loc]
(filter #(and (z/branch? %) (= tokenname (token %)))
(if (zf/auto? loc)
(zf/children-auto loc)
(list (zf/auto true loc))))))
(defn java->
[loc & preds]
(zf/mapcat-chain loc preds #(cond (string? %) (token= %))))
これは露骨Chouserの素敵なXML->関数からコピーされます。残念ながら、それはうまくいきません。 zip-filterの内部で、関数 "auto"はオブジェクトにメタデータを追加または削除します。例外的に、の一般的な古いJavaオブジェクトは、メタデータを持つことができません。
私は間違った木を吠えますか?または、(もっと可能性が高い)、私はそれをコピーするのに十分なくらいのフィルタを理解していないのですか?
トークン=の最初の条件の良いキャッチ。それは私が完全に理解していなかったコードをコピーする私のエラーでした。 java->関数は最終的に他の条件をサポートするためのものですが、この問題を理解するために他の述語を取り除いたため、無名関数の縮退した形があります。 全体的に、「うまくいけない」というのは、自動でCommonTreeオブジェクトでwith-metaを実行しようとすると、ClassCastExceptionが発生するということです。 with-metaはIObjのインプリメンタ(Clojureオブジェクト)に対してのみ機能します。 – mtnygard
Antlrを使用して、Clojureデータ構造を表す文字列に "コンパイル"することもできます。クール。おもう。 AntlrのASTオブジェクトとClojure関数の間のインピーダンスの不一致をどのように減少させるかが分かります。どういうわけか、シカゴ経由でサンフランシスコからシアトルへ飛んでいるような気がします。 – mtnygard
エラー.hmmm。スタックトレースの関連部分を投稿できますか?私はオートの上の呼び出しが '子供たちからのものかもしれないと思いますか? –