現在、Tomcatコンテナで既存のJ2EE Webアプリに機能を追加している最中であり、Clojureを使用して追加を記述しています。私のセットアップは単純です。clojureによって生成された静的メソッドへの呼び出しを追加し、clojure側からすべてのハードワークをコーディングするだけです。ビルドプロセスは、clojureコード(lein uberjar
)をコンパイルしてから、クラスパス上のそのjarを使用してJavaコードをコンパイルすることで構成されます。
webapp initで、生成されたクラスを呼び出して、swankサーバーを。で起動します(swank/start-repl)
。Aquamacsのスライムをそのサーバーに接続し、そこからインタラクティブに作業できるようにしたいと思います(ある程度までは、Java側の再コンパイルを必要とするものは何も試しません)。でも、よくわからない状況があります。を実行する\M-x slime-connect
と、REPLプロンプトが表示されます(下位のlispプロセスがemacsの制御外で実行されているため、下位のlispプロセスがないことが通知された後は問題ないと思います)。フォームを完璧に評価でき、のようなものも検査できmy.own.namespace/my-var
ます。ただし、すでにコンパイル済みのclojureコードを含むファイルにアクセスすると、スライムにそのソースとして認識させることができないようです。単純なclojureファイルを考えてみましょう。
(ns my.namespace
(:gen-class
:name my.namespace
:methods [#^{:static true} [testFunc [] void]]))
(def *secret* "shhhh")
(defn -testFunc []
(println (str "our secret is: " secret)))
これがコンパイルされ、webappによってロードされたuberjarに含まれていると仮定すると、eval/inspectを実行できmy.namespace/*secret*
ます。しかし、コードバッファー内で評価しようとすると、Slimeは私がuser
名前空間にいると見なします(これは理にかなっていることさえあります!)。しかし、今では、ファイル内のすべてのフォームを1つずつ評価する必要がある単一の作業オプションが残っています。\C-c \C-l
(ソースファイルのロード)は何もしません-どうやらnilを返し、他には何も出力しないようです。すべてをコンパイルすると、まさにそれが行われるように見えます。コンパイルされ、見つかった場合はエラーが表示されますが、名前空間は変更されません。そして最も奇妙なのは\C-~
(syncパッケージとディレクトリ)で、Common Lispを使用して私が望むことを実行しますが、ここではclojureREPLを永久にフリーズします。
REPLに切り替えて入力する(in-ns 'my.namespace)
と、すべてが正しく機能するというオプションが常にあります。しかし、clojureファイルの数が増えている場合(コードバッファーの名前空間は自動的に変更されないため)、これは単に十分に実用的ではありません。
私の質問は、基本的なコマンド/構成が不足しているかどうか、またはこの動作がそのように発生する明らかな理由があるかどうかです。