2010-06-27 3 views
4

나는 애플 리케이션이 일들로 주위에 엉망이 실행되는 동안 연결을 목적으로 내 응용 프로그램에 swank-clojure repl을 포함하려고합니다. 그러나 repl를 시작한 후 엔 클로징 환경에 액세스하는 방법을 파악하는 데 문제가 있습니다. 이맥스에서 다음 이상 ..임베디드 swank-clojure가 임베디드 된 프로그램에 액세스 할 수 있습니까?

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

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

프로그램을 실행 : 잘 작동

M-x slime-connect 

내가 연결하고

젠체하는-Clojure의 REPL을 포함하면 쉽게 충분하다.

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

은 그래서 임베디드 REPL 현재 환경을 전달하는 방법으로 작동하지 않습니다

: 자, 내가 을 기대하는 것은이 작동 것이라고했다.

임베디드 REPL이 실행중인 프로그램과 상호 작용할 수있는 방법이 있습니까?

그렇지 않은 경우 REPL을 임베드하는 이유는 무엇입니까?

아무런 차이가 없으면이 파일을 JAR 파일로 실행하려고합니다.

이 스레드는 관련,하지만 난 그게 어디서나 얻을 수 없습니다 것 같다 :

Embedding swank-clojure in java program

답변

5

let -bound 지역 주민 어휘 범위가 있으며, 따라서 swank.swank/start-repl는 싸여 let 형태에 의해 영향을받지 않습니다 그것에 대한 호출 주위. 그러나 실행중인 REPL은 응용 프로그램의 클래스 경로에있는 Clojure 네임 스페이스를 require/use (또는 REPL의 네임 스페이스를 그 중 하나로 전환하기 위해 in-ns을 사용할 수 있습니다.) 및 import 클래스 경로의 모든 Java 클래스를 사용하여 여러 가지 작업을 수행 할 수 있습니다. 기능을 재정의하고, Vars에서 보유하고있는 모든 Ref/Atoms/다른 내용의 내용을 검사하고 변경하는 등의 유용한 기능을 제공합니다.

ns(:use swank.swank) 형태; (:require swank.swank) 대신 차이점은 후자는 (use = require + refer, 자세한 내용은 (doc use) 등을 참조하십시오.) 전자는 swank.swank의 공개 Vars를 네임 스페이스에 모두 가져옵니다. Swank의 Vars에 액세스하기 위해 네임 스페이스로 한정된 기호를 사용하는 것 같습니다. 나머지 코드도 변경하지 않아도되고 require은 네임 스페이스를 어지럽히는 것을 방지합니다. 대안 적으로, (:use [swank.swank :only [start-repl]]); 이 경우 start-repl Var 만 가져오고 swank.swank/ 비트없이 바로 사용할 수 있습니다.

+1

답변을 주셔서 감사합니다. 미칼과 내 문제를 지적 해주십시오. :/: 사용을 요구하십시오. 네임 스페이스에 대한 여러분의 의견이 핵심이었습니다. 나는 이전에 (def x)를 시도했지만 REPL이 잘못된 네임 스페이스에 있었기 때문에 * 작동하지 않는 것 같습니다. 흥미있는 다른 사람들을 위해, 이것과 비슷한 것은 작동하는 것처럼 보입니다 .. (def x (atom nil)) (defn -main [& args] (do (reset! x "123") (start-swank))) 그런 다음 슬라임 연결을 실행하고 REPL에서 올바른 네임 스페이스로 전환하십시오. (ns "뭐든") – allclaws