从Java中运行Clojure REPL,提供自定义上下文。

8
我该如何从我的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个回答

6

您正在寻找clojure.contrib/server-socket的create-repl-server函数:

以下是示例的摘录:

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

这个SO问题上也有很多关于如何启动Clojure REPL的想法。


不确定那是否是我正在寻找的东西。如果你这么说,也许你是对的,但请看一下我上面的编辑。 - zedoo
1
如果你想更简单的话,只需要调用 create-repl-server 11111 并连接到本地主机即可。你不必担心如何启动 Web 服务器来启动你的 REPL,直接这样做就可以了。 - Arthur Ulfeldt
但我想我希望从我的Java“主机”应用程序内部开始它。 - zedoo
是的,主机需要运行它。请参考https://dev59.com/ZHI95IYBdhLWcg3wtwf4中的被接受的答案。 - Arthur Ulfeldt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接