1

Clojureソースファイルで「必須」または「使用」されていない名前空間で関数を検索するにはどうすればよいですか? 基本的に私がやりたいのは、ソースファイルを用意することです:

main.clj,
a.clj,
b.clj,
c.clj

すべて一緒にコンパイルされますが、直接ではありませんimport/ require/use メインの a、b、または c。代わりに、main にコマンド ライン パラメーターを指定して、適切な関数 (おそらく完全修飾シンボルだけでも) を検索します。

見ましns-publicsたが、名前空間シンボルが必要です。bultitudesrc/ dir からすべての名前空間を取得しようとしましたが、lib.a、lib.b、lib.c、lib.main などを取得しましたが、main は使用も要求も参照もしていないため、他のものを参照しています。名前空間 ns-publics を使用するとエラーが発生します。-ns ソースコードの tryNo namespace lib.a foundに従って。

プロジェクトに含まれているが、特定のファイルによって直接参照されていないコードのパブリック インターフェイス、または参照の依存関係を確認するにはどうすればよいですか?

4

2 に答える 2

0

より良い解決策が見つかるまで役立つかもしれない簡単な回避策があります。ファイルで定義されているすべてのパブリックシンボルのリストを返します。ファイルを読んで、すべてのセックスを探しましょうdef。プライベートなもの、つまりのようなものは無視してdefn-ください。

(let [file (with-in-str (str "(" (slurp filename) ")") (read))
      defs (filter #(.matches (str (first %)) "^def.*[^-]$") file)
      symbols (map second defs)]
  symbols)

警告:

  • まあ、それは単にナイーブです。
  • すべてのプライベート定義を削除するわけではありません。で定義されたもの、^{:private true}または^:private除外されないもの。
  • 定義は、マクロを使用して生成できます。

最後のポイントは特に厄介です。マクロで生成された定義を検出する唯一の合理的な方法は、少なくとも部分的に、リーダーでファイルを評価することです。

于 2013-01-10T23:19:58.443 に答える
0

clojure は非常に動的であるため、解析は機能しません。

だから、このようなものはうまくいくかもしれません...

(load-file "file_with_stuff.clj")
(ns-publics (find-ns 'file-with-stuff))
(remove-ns 'file-with-stuff)

すべてを動的に実行したい場合は、symbol を使用してシンボルを生成できます -- それでも動作するはずです。ns の削除はオプションです。害はありませんが、元の場所に戻ります。

于 2013-01-11T10:08:47.423 に答える