我想以Clojure REPL的形式提供一个应用程序。Ie.用户从终端运行的东西,它有一个完整的Clojure REPL,其中包含一些作为Clojure函数的额外功能。
我希望整个过程都生活在一个独立的JAR中,而不是依赖于已经安装了Clojure的用户,或者知道如何安装Clojure或导入额外的库。跑步时,整个东西都应该在那里。
有没有一种简单的方法可以做到这一点?重复使用现有的Clojure REPL代码?
您所要做的就是在自己的main中运行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,因此您可以从那里运行不同的main
:s。
自我广告:如果你需要进一步的灵感,这些是我过去做过的"修改"REPL:
- REST-REPL:添加有状态URL导航和使用JSON/XML API的工具
- WREPL:使用被积函数为REPL生成基于模块的组合