5

現在、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ファイルの数が増えている場合(コードバッファーの名前空間は自動的に変更されないため)、これは単に十分に実用的ではありません。

私の質問は、基本的なコマンド/構成が不足しているかどうか、またはこの動作がそのように発生する明らかな理由があるかどうかです。

4

3 に答える 3

5

私はあなたの問題を誤解しているかもしれませんが、(emacsでこの架空のバッファーにアクセスしているときに)C-c C-k現在のClojureインスタンス(Slimeが接続されているもの)のバッファーをコンパイルするためにヒットすることはできませんか?

次に、Slimeバッファーで、。を使用してこの名前空間に切り替えます(in-ns 'my.namespace)。次に、その名前空間でコンパイルしたものにアクセスできるはずです。

于 2010-08-12T19:09:38.933 に答える
2

Switching namespaces automatically on compile has never been the default for swank-clojure, though it might be an optional slime feature that happened to work with Clojure. But C-c M-p to switch the repl to the current buffer's namespace has always worked for me, and I've never heard of anyone having trouble with it.

Are you running on the latest stable versions of clojure-mode and slime-repl? Do you have swank-clojure.el installed? (You shouldn't need it.) It sounds like this could be due to mismatched versions of the elisp libs. If that's not the problem it could be an Aquamacs bug; swank-clojure is designed to work with GNU Emacs. It could also be a bug in slime if you are running from trunk rather than the latest elpa release.

于 2010-08-13T17:48:50.790 に答える
1

この問題の犯人を削除したところ slime-redirect-inferior-output、slime-repl.el から、セットアップしたフックから呼び出されていたことがわかりました。これは、inferior-lisp-process (emacs 内から開始されたスワンク サーバー) がないとうまく動作しないことが判明しました。

したがって、簡単な回避策のハックは、このerrorようにその関数からフォームを削除することです。これでフックが進み、名前空間が自動的に計算されます。意図した通り。それにもかかわらず、提案をありがとう-彼らは私をこの解決策に導きました!

于 2010-08-21T11:44:11.953 に答える