ClojureソースファイルをEMACSで実行中のClojure Replに接続するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/3470999

  •  28-09-2019
  •  | 
  •  

質問

私は現在、既存のJ2EE WebAppに機能をTomcatコンテナに追加しています。Clojureを使用して追加を書いています。私のセットアップは簡単です。Clojureによって生成された静的メソッドへの呼び出しを追加し、Clojure側からすべてのハードワークをコーディングします。ビルドプロセスは、Clojureコードのコンパイルで構成されています(lein uberjar)次に、クラスパスにその瓶でJavaコードをコンパイルします。

WebApp initでは、生成されたクラスへの呼び出しがあり、スワンクサーバーに (swank/start-repl). 。 Aquamacsのスライムをそのサーバーに接続し、そこからインタラクティブに作業できるようにしたいと思います(ある程度まで、Java側の再コンパイルを必要とすることは何もしません)。しかし、私にはよくわからない状況があります。私がする場合 \M-x slime-connect, 、私はREPLプロンプトを取得します(劣ったLISPプロセスがないことを通知された後、劣ったLISPプロセスがEMACSコントロールの外で実行されているため、大丈夫だと思います)。フォームを完全に評価することができ、次のことを検査することさえできます my.own.namespace/my-var. 。ただし、既にコンパイルされたClojureコードを備えたファイルにアクセスした場合、Slimeにそれをそのソースとして認識させることはできません。単純な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に含まれていると仮定すると、評価/検査ができます my.namespace/*secret*. 。しかし、コードバッファー内で評価しようとすると、Slimeは私がいると思います user 名前空間(理にかなっていることさえできます!)。しかし今、私は単一の作業オプションを残しています - 私は評価する必要があります - 1つずつ、ファイル内のすべてのフォームです! \C-c \C-l (ソースファイルのロード)は何もしません - どうやらNILを返して、他に何も出力しません。すべてをコンパイルすることはまさにそれを行うようです - それはコンパイルされ、それらが見つかった場合にエラーを表示しますが、名前空間は変更されません。そして、最も奇妙なのはです \C-~ (同期パッケージとディレクトリ)、それは一般的なLISPを使用して私が望むことだけをしますが、ここではClojure Replを永久にフリーズします。

REPLに切り替えるオプション、タイピングが常にあります (in-ns 'my.namespace), 、その後、すべてが適切に機能します。しかし、Clojureファイルの数が増えている場合、それは単に実用的ではありません(コードバッファの名前空間が自動的に変更されないためです!)

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

役に立ちましたか?

解決 3

この問題のために犯人を削除することがわかったばかりです。 slime-redirect-inferior-output, 、Slime-repl.elから、セットアップがあったフックから呼ばれていました。劣ったリスププロセスなしではうまく機能しないことがわかります(読んでください、SwankサーバーはEMACS内から開始されました)。

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

他のヒント

私はあなたの問題を誤解しているかもしれませんが、あなたは(EMACSでこの仮想バッファーを訪れたときに)、ヒットすることはできません C-c C-k 現在のClojureインスタンスでバッファーをコンパイルするには(どのスライムが接続されていますか)。

次に、スライムバッファーで、 (in-ns 'my.namespace). 。次に、その名前空間でコンパイルしたものにアクセスできるはずです。

コンパイル上の名前空間を自動的に切り替えることは、Swank-Clojureのデフォルトではありませんでしたが、Clojureで動作するオプションのスライム機能かもしれません。しかし、CC MPが現在のバッファーの名前空間にREPLを切り替えるためのCC MPは常に私のために働いてきました。

Clojure-ModeとSlime-Replの最新の安定したバージョンで実行していますか? Swank-Clojure.elをインストールしましたか? (あなたはそれを必要としないはずです。)これは、Elisp Libsの不一致のバージョンによるものであるように聞こえます。それが問題でない場合、それはアクアマックスのバグかもしれません。 Swank-Clojureは、GNU Emacsを使用するように設計されています。また、最新のELPAリリースではなくトランクから走っている場合、スライムのバグになる可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top