首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Lisp或Scheme实现Java程序的运行时配置

使用Lisp或Scheme实现Java程序的运行时配置
EN

Stack Overflow用户
提问于 2011-05-28 09:16:32
回答 4查看 1.3K关注 0票数 11

现在,我已经看到了几个项目的结束点,即实际的配置取决于只有在运行时可用的东西。

配置Java程序的典型方法是根据特定于应用程序的规则读取一个或多个属性文件,然后根据它们的值采取行动。在某种程度上,这会发生故障,您需要在配置中使用实际的程序逻辑,然后可以使用一个标志来指示该程序,并将代码添加到应用程序中,然后应用程序处理标志。

我想知道一个很小的Lisp配置读取器模块是否是一个更好的选择,其中要读取的文件不是属性文件,而是一个Lisp程序,然后这个程序可以创建一个表示配置的最终数据结构。运行时库中的一组函数将允许字符串操作,甚至允许调用JVM。只需想一想“基于当前主机名构建一个URL”。

我不感兴趣的是一个完整的Lisp引擎,它只是一个用于这个目的的小型库,即使没有一个包含Lisp引擎的大jar,它也可以包含在小程序中。

这样的图书馆存在吗?

  • 小尺寸
  • 只需要读取文件+ eval和从主Java程序读取结果数据结构的能力
  • 一个小型的Lisp运行时库
  • 速度不是很重要。
  • 积极维护。

有什么建议吗?

编辑2012-01-20:我最初发现所有的候选人都是不受欢迎的,但我已经决定将其作为一个1998年联合方案1.4发行版的Maven练习。https://github.com/ravn/jscheme-1998项目

编辑2012-12-11:原来在Scheme中解释的程序与宿主Java程序之间的集成层比我最初认为的更重要,而且我需要在一个项目中能够在运行时提供JAX注释的类,这是我不能用JScheme做的,但是我可以用Groovy来完成。允许在库中使用代码片段的小型配置库的想法仍然有效,但我最终需要更多的配置库才能使其有用。

EN

回答 4

Stack Overflow用户

发布于 2011-05-28 09:40:11

我知道你想要一个小尺寸和运行时间。方案是通常的选择,容易嵌入,将是我的第一选择。不过,我没有那个领域的信息。我的第二个选择是http://clojure.org/

  • 没那么小,罐子是3MB
  • 对于简单的配置读取,过度使用,但是额外的功能可以安全地忽略。
  • ~易于从Java调用:从java调用clojure
  • 充分、出色地访问JVM
  • 可能会在启动时调用一个小的额外值,这可能会太多(参见下面)
  • 现在我尝试用Clojure复制示例的功能,我觉得Clojure不太适合这类脚本(rc,等等)。Clojory1.3将解决一些启动方面的问题,但我不知道速度提高的程度。

使用Clojure的相应代码

代码语言:javascript
复制
import clojure.lang.RT;
import clojure.lang.Var;
import clojure.lang.Compiler;
import java.io.FileReader;
import java.io.FileNotFoundException;

public class ClojTest {
    public static void main(String[] args) throws Exception {
        try {
            Compiler.load(new FileReader("hello.clj"));
        } catch(FileNotFoundException e) { return; }

        System.out.println("Message: '"+ RT.var("user", "msg").get() +"'");

        // Values
        int answer = (Integer) RT.var("user", "answer").get();

        // Function calls
        System.out.println(RT.var("user", "countdown").invoke(42));
    }
}

hello.clj为:

代码语言:javascript
复制
(ns user)
(defn countdown [n]
  (reduce + (range 1 (inc n))))

(def msg "Hello from Clojure!")
(def answer (countdown 42))

运行time java ClojTest一段时间平均只需0.75秒。 Clojure编译脚本将付出相当大的代价!

票数 8
EN

Stack Overflow用户

发布于 2011-05-28 10:18:31

好的,小得多的解决方案是嵌入式Java方案。在许多实现中,我找到并测试了JScheme。(API看起来不错:http://jscheme.sourceforge.net/jscheme/doc/api/index.html)

Java的一个简单的主程序:

代码语言:javascript
复制
import jscheme.JScheme;
import jscheme.SchemeException;
import java.io.*;
public class SchemeTest {
    public static void main(String[] args) {
        JScheme js = null;
        try {
            js = new JScheme();
            js.load(new FileReader("config.scm"));
        } catch (FileNotFoundException e) { return; }

        System.out.println("Message: '" + js.eval("msg") + "'");

        // Values
        int answer = (Integer) js.eval("answer");

        // Function calls
        System.out.println(js.call("countdown", 42));
    }
}

还有一个例子config.scm

代码语言:javascript
复制
(define (countdown x)
  (define (loop x acc)
    (if (= x 0)
      acc
      (loop (- x 1) (+ acc x))))
  (loop x 0))

;;; config variables
(define msg "Hello from JScheme!")
;; tail calls are optimized as required
(define answer (countdown 42))

该方案是在每次启动解释,所以这是很好的选择配置。JScheme的优势包括:

  • 良好的JVM集成
  • 显然是一项完整的计划实施
  • 小尺寸(572 kB)
  • 快速,有点容易从Java调用

基准更新:此代码以0.13秒时间运行。与Clojure版本的时间相比,这是相当快的。

票数 8
EN

Stack Overflow用户

发布于 2011-05-28 10:28:04

试试监委会,它是一个相当小(300 no的jar)方案实现,没有花哨。将它与Java粘合在一起很简单,对于纯解释器来说,执行速度是相当可观的。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6160722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档