4

アプリの実行中に接続して物事をいじくりまわす目的で、swank-clojure repl をアプリケーションに埋め込もうとしています。しかし、repl を開始した後、囲んでいる環境にアクセスする方法がわかりません。

swank-clojure REPL を埋め込むのは簡単です:

(ns mytest
  (:use [swank.swank :exclude [-main]])
  (:gen-class))

(defn -main [& args]
  (let [x 123]
    (swank.swank/start-repl)))

プログラムを実行してから、emacs で次のように実行します。

M-x slime-connect 

それは正常に機能し、接続されています。さて、私が望んでいたのは、これが機能することでした:

(println x)
;; 123 (what I was hoping for)
;; Unable to resolve symbol: x in this context (cruel reality)

そのため、現在の環境を組み込み REPL に渡す方法としては機能しません。

埋め込まれた REPL が実行中のプログラムと対話する方法はありますか?

そうでない場合、REPL を埋め込む理由は何ですか?

違いがある場合は、これを JAR として実行しようとしています。

このスレッドは関連しているようですが、そこからどこにも行けませんでした:

Javaプログラムにswank-clojureを埋め込む

4

1 に答える 1

5

let-bound ローカルはレキシカル スコープであるため、その呼び出しをラップswank.swank/start-replするフォームの影響を受けません。letただし、実行中の REPL は、アプリケーションのクラスパス上の任意の Clojure 名前空間 (またはREPL の名前空間をそれらのいずれかに切り替えるために使用) およびクラスパス上の任意の Java クラスに対して / を実行できるため、多くの非常に便利なことを行うことができますrequire。関数の再定義、Refs / Atoms / Vars に保持されているその他の対象の内容の調査と変更、関数 / Java メソッドの呼び出しなど。usein-nsimport

おそらくフォームに入れるべきではないことに注意して(:use swank.swank)くださいns(:require swank.swank)代わりは。違いは、前者はすべてswank.swankの public Vars を名前空間に取り込みますが、後者は取り込まないことです (詳細についてはuse = require + refer(doc use)etc. を参照してください)。名前空間で修飾されたシンボルを使用して Swank の Vars にアクセスしているように見えるため、コードの残りの部分を変更する必要さえなくrequire、名前空間が乱雑になるのを回避できます。または、(:use [swank.swank :only [start-repl]]); これにより、Var だけが取り込まれ、ビットstart-replなしで直接使用できます。swank.swank/

于 2010-06-27T12:56:45.017 に答える