2012-02-04 21 views
7

¿Cómo puedo iniciar Clojure REPL desde mi aplicación java y proporcionar algunas "variables predefinidas" (soy un novato en Clojure, supongo que hay un término mejor para eso)? De hecho, ya intenté hacerlo funcionar por coincidencia ... Empecé con clojure.main y agregué una llamada adicional a RT.var(). ¿Es esta la forma correcta de hacerlo?Ejecute Clojure REPL desde java, brindando contexto personalizado

import clojure.lang.Symbol; 
import clojure.lang.Var; 
import clojure.lang.RT; 

public class MyClojure { 

    final static private Symbol CLOJURE_MAIN = Symbol.intern("clojure.main"); 
    final static private Var REQUIRE = RT.var("clojure.core", "require"); 
    final static private Var MAIN = RT.var("clojure.main", "main"); 

    // Provide some context, this is my custimisation... 
    @SuppressWarnings("unused") 
    final static private Var Test = RT.var("testme", "myvar", "This is the initial value"); 

    public static void main(String[] args) throws Exception { 
     REQUIRE.invoke(CLOJURE_MAIN); 
     MAIN.applyTo(RT.seq(args)); 
    } 
} 

EDIT: Mi aplicación no es una aplicación web. Es una aplicación de escritorio independiente que básicamente muestra/edita un modelo de datos Pojo. Ahora quiero agregar soporte para exponer el modelo de datos de la aplicación en ejecución a un clojure repl. Entonces podría modificar/inspeccionar el modelo de datos tanto a través de la aplicación original como de la réplica.

Respuesta

5

que estés buscando el clojure.contrib/server-socket's create-repl-server function:

aquí es un extracto de los ejemplos:

(use '[clojure.contrib.server-socket :only [create-repl-server]]) 
(gen-class 
    :name "org.project.ReplServer" 
    :implements [javax.servlet.ServletContextListener]) 
(defn -contextInitialized [this e] 
    (.start (Thread. (partial create-repl-server 11111)))) 

también hay una gran cantidad de ideas sobre this SO question

+0

No estoy seguro si eso es realmente lo que estoy buscando. Si lo dices, entonces tal vez tengas razón, pero mira mis ediciones anteriores. – zedoo

+0

, entonces es incluso más fácil que eso, solo llame a 'create-repl-server 11111' y conéctese a localhost. no tiene que preocuparse de intentar obtener un servidor web para iniciar su repl, puede hacerlo directamente. –

+0

Pero supongo que quisiera iniciarlo desde dentro de mi aplicación java "host". – zedoo