我想以Clojure REPL的形式提供应用程序。就是用户从终端运行的东西,并具有完整的Clojure REPL,其中包括Clojure函数附带的一堆额外功能。
我希望整个过程都驻留在独立的JAR中,而不依赖于已经安装Clojure或不知道如何安装Clojure或导入额外库的用户。整个程序在运行时应该就在那里。
有没有简单的方法可以做到这一点?就是重用现有的Clojure REPL代码?
答案 0 :(得分:4)
您要做的就是在自己的主程序中运行clojure.main/repl
。
文档解释了您拥有的切入点:
"Generic, reusable, read-eval-print loop. By default, reads from *in*, writes to *out*, and prints exception summaries to *err*. If you use the default :read hook, *in* must either be an instance of LineNumberingPushbackReader or duplicate its behavior of both supporting .unread and collapsing CR, LF, and CRLF into a single \\newline. Options are sequential keyword-value pairs. Available options and their defaults: - :init, function of no arguments, initialization hook called with bindings for set!-able vars in place. default: #() - :need-prompt, function of no arguments, called before each read-eval-print except the first, the user will be prompted if it returns true. default: (if (instance? LineNumberingPushbackReader *in*) #(.atLineStart *in*) #(identity true)) - :prompt, function of no arguments, prompts for more input. default: repl-prompt - :flush, function of no arguments, flushes output default: flush - :read, function of two arguments, reads from *in*: - returns its first argument to request a fresh prompt - depending on need-prompt, this may cause the repl to prompt before reading again - returns its second argument to request an exit from the repl - else returns the next object read from the input stream default: repl-read - :eval, function of one argument, returns the evaluation of its argument default: eval - :print, function of one argument, prints its argument to the output default: prn - :caught, function of one argument, a throwable, called when read, eval, or print throws an exception or error default: repl-caught"
这里要做的常见事情:
:init
:添加您自己的设置以供REPL使用。例如。 use
一些图书馆:prompt
:显示与ns不同的“状态” :print
:使用某种漂亮的打印机值得一提的是,您构建的每个包含clojure.main
(例如clojure-$VERSION.jar
)的程序(例如uberjaring)都可以从该uberjar运行REPL,因此您可以运行不同的{{1} }:s从那里。
自我广告:如果您需要进一步的灵感,这些是我过去做过的“修改过的” REPL: