2012-02-04 23 views
7

如何从我的java应用程序启动Clojure REPL并提供一些“预定义变量”(我是Clojure新手,我猜这里有更好的术语)?事实上,我已经试图让它巧合地工作......我开始使用clojure.main并添加了一个额外的RT.var()调用。这是做到这一点的正确方法吗?从java运行Clojure REPL,提供自定义上下文

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

编辑:我的应用程序不是一个web应用程序。它是一个独立的桌面应用程序,基本显示/编辑pojo数据模型。我现在想要添加支持以将数据模型从正在运行的应用程序暴露给clojure repl。然后我可以修改/检查数据模型,包括原始应用程序和repl。

回答

5

你正在寻找的clojure.contrib/server-socket's create-repl-server function

这里是从例子中的摘录:

(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)))) 

也有上this SO question很多想法

+0

不知道是否真的that's我在找什么。如果你这样说,那么也许你是对的,但看到我上面的编辑。 – zedoo 2012-02-05 18:49:21

+0

然后它比这更简单,只需调用'create-repl-server 11111'并连接到本地主机。你不必担心试图让Web服务器启动你的repl,你可以直接使用它。 – 2012-02-06 17:07:14

+0

但我想我想从我的java“主机”应用程序中启动它。 – zedoo 2012-02-11 15:55:01