从java运行Clojure REPL,提供自定义上下文

时间:2012-02-04 17:36:03

标签: clojure

如何从我的java应用程序启动Clojure REPL并提供一些“预定义变量”(我是一个Clojure新手,我想这是一个更好的术语)?事实上,我已经尝试通过巧合使其工作......我从clojure.main开始,并添加了对RT.var()的额外调用。这是正确的方法吗?

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。

1 个答案:

答案 0 :(得分:6)

您正在寻找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

上也有很多想法