2010-04-18 17 views
6

In base alla sezione di incorporamento di http://github.com/technomancy/swank-clojure, sto usando quanto segue per provarlo. C'è un modo migliore per fare questo che non usa il compilatore? C'è un modo per programmare automaticamente stop swank? Sembra che start-repl prende il controllo del thread. Che cosa sarebbe un buon modo per generare un altro thread per esso ed essere in grado di eliminare tale thread a livello di codice .Incorporamento di swank-clojure nel programma java

import clojure.lang.Compiler; 
import java.io.StringReader; 

public class Embed { 
    public static void main(String[] args) throws Exception { 
     final String startSwankScript = 
      "(ns my-app\n" + 
       " (:use [swank.swank :as swank]))\n" + 
       "(swank/start-repl) "; 
     Compiler.load(new StringReader(startSwankScript)); 
    } 
} 

Qualsiasi aiuto molto apprezzato, HHH

risposta

5

Sarebbe accettabile a voi per implementare la classe Embed in Clojure? È possibile farlo con gen-class (vedere Meikel Brandmeyer's tutorial per i dettagli) e la compilazione AOT.

Il codice potrebbe andare qualcosa come

(ns your-app.Embed 
    (:require [swank.swank :as swank]) 
    (:gen-class 
    :methods [[startSwank [] void]])) 

(defn -startSwank [] 
    (swank/start-repl)) 

(aggiungere qualcos'altro che richiedono); quindi nella parte Java dell'applicazione, è possibile importare la classe preparata Clojure, creare un'istanza e chiamare .startSwank() nell'istanza.

Non sono sicuro di fermare Swank programmaticamente ... Sarei curioso di sapere di un buon modo per farlo da solo. (E tornerò con un aggiornamento se riesco a capirlo, altrimenti mi piacerebbe leggere la risposta di qualcun altro che spiega come farlo.)