2010-04-18 5 views
6

Basierend auf der Einbettung von http://github.com/technomancy/swank-clojure, Ich verwende Folgendes, um es zu testen. Gibt es eine bessere Möglichkeit, dies zu tun, die Compiler nicht verwendet? Gibt es eine Möglichkeit, programmgesteuert Stop Swank? Es scheint, dass Start-Repl die Kontrolle über den Thread übernimmt. Was wäre eine gute Möglichkeit, einen anderen Thread für sie spawn und diesen Thread programmatisch zu töten.Embedding Swank-Clojure in Java-Programm

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)); 
    } 
} 

Jede Hilfe sehr geschätzt, hhh

Antwort

5

Wäre es für Sie akzeptabel, die Embed Klasse in Clojure zu implementieren? Sie könnten das mit gen-class (siehe Meikel Brandmeyer's tutorial für Details) und AOT Kompilierung tun.

könnte der Code gehen so etwas wie

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

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

(fügen Sie alles, was Sie benötigen); Dann könnten Sie im Java-Teil Ihrer Anwendung Ihre von Clojure vorbereitete Klasse importieren, instanziieren und .startSwank() für die Instanz aufrufen.

Ich bin nicht sicher, Swank programmatisch zu stoppen ... Ich wäre neugierig, einen guten Weg zu kennen, dies selbst zu tun. (Und ich werde mit einem Update zurück sein, wenn ich es herausfinden werde; ansonsten würde ich gerne die Antwort von jemand anderem lesen, die genau beschreibt, wie das geht.)