2

別の .clj ファイル内から .​​clj ファイルをロードおよび/またはコンパイルしようとしています。ロードしようとしているファイルには一連のマップが含まれているだけなので、これを行っています。最終的にはこれらを xml ファイルに置き換えるつもりです。ファイルだけ:useでも機能しますが、外部データの束をロードする練習をしようとしています。

(emacsなどを介して)replをランダムにハッキングすることで(load "default_libs")、なんとか(名前空間修飾子、、、および(compile...)のさまざまな組み合わせを使用して)マップにアクセスすることができましたが、replを再起動した後は機能しませんでしたとにかく、完全な名前空間名を使用してデータを取得する必要がありました。'"

これは lib_manager.clj です。

(ns mycad.lib-manager
  (:use [clojure repl]
        [mycad utils]))

(compile 'mycad.default-libs)
(println mycad.default-libs/default-symbols) 

これは、ロードしようとしているファイルですdefault_libs.clj。ここにあるデータは最終的に何らかの xml ファイルになりますが、私はまだこれにかなり慣れていないので、今のところ、大量の clojure マップを直接記述しました。

(ns mycad.default-libs)
(def default-symbols {.... })

.cljしたがって、問題は、実際に名前空間にロードせずにファイルから大量のデータをロードするにはどうすればよいかという(ns...)ことloadですcompile

助けてくれてありがとう

4

2 に答える 2

2

compile質問の前半で説明したように、例の を a に変更loadします。次に、例が機能します。

compile名前空間の AOT コンパイルに使用されます。したがって、ここで必要なものではありません。

定義されたマップが 1 つしかない場合は、 を使用できますload-file

(def default-symbols (load-file "/file/path.clj"))

「ファイル」が実際にクラスパスのどこかにある場合、または他の非ローカルストリームによって、load-string.

(def default-symbols (load-string (slurp (io/reader stream))))
于 2012-07-25T09:04:52.453 に答える
0

Lisp は非常に動的な言語です。Clojure は Lisp であるため、次のことが可能です。

user=> (eval (read-string "(def a 10)"))
#'user/a
user=> a
10

したがって、たとえばhereread-allから関数を使用してファイルをロードし、次にすべてのフォームをロードできます。(eval

(use 'clojure.java.io) ; for (reader ..) function
(import 'java.io.PushbackReader)
....
(doseq [f (read-all (PushbackReader. (reader "your/file.clj")))] (eval f))

次に、初期化のみfile.cljが含まれている場合(def、それらは現在の名前空間にあり、単純な変数として使用できます。ただし、file.clj名前空間を変更するフォーム ( (ns..)(in-ns ..)) が含まれている場合は、現在の名前空間が変更されるため、状況が複雑になる可能性があります。そのような宣言が必須であり、ファイル自体で削除できない(eval場合は、それが定義である場合にのみフォームを ing して、それらをフィルター処理することができます。

更新(eval: うーん、 +はある意味で:(read-allと同等であることがわかりました。(load-file

(load-file "your/file.clj")

ただし、load-file名前空間を変更するコマンドがあっても名前空間が変更されない場合、これらの名前空間はメモリに読み込まれるだけで、通常どおりそれらのシンボルを参照できます。これが必要なもののようです。

于 2012-07-25T13:40:52.137 に答える