【问题标题】:Run Clojure REPL from java, providing custom context从 java 运行 Clojure REPL,提供自定义上下文
【发布时间】:2012-02-04 17:36:02
【问题描述】:

如何从我的 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 修改/检查数据模型。

【问题讨论】:

    标签: clojure


    【解决方案1】:

    您正在寻找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上也有很多想法

    【讨论】:

    • 不确定这是否真的是我想要的。如果你这么说,那么也许你是对的,但请参阅我上面的编辑。
    • 那就更简单了,只需调用create-repl-server 11111 并连接到本地主机。您不必担心尝试让网络服务器启动您的 repl,您可以直接进行。
    • 但我想我想从我的 java“主机”应用程序中启动它。
    • 是的,主机需要运行它,查看接受的答案stackoverflow.com/questions/2181774/calling-clojure-from-java
    猜你喜欢
    • 1970-01-01
    • 2014-02-13
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    相关资源
    最近更新 更多