当我使用repl
function from clojure.main
时,如何从REPL获得类似readline(或类似rlwrap)的功能?
这背景是我正在使用和定制来自The Clojure,First Edition的break
function。我在lein repl
REPL中使用它。当我的"断点"踢进去,Leiningen的REPL的类似readline的功能已经消失,这有点不方便。我的肌肉记忆让我点击↑,紧接着 Enter 。在我能够阻止自己之前,我已经在我的终端中找到了这个:
debug=> ^[[A
CompilerException java.lang.RuntimeException: Unable to resolve symbol: in this context, compiling:(/tmp/form-init13211381000659590518.clj:1:1)
现在我的REPL卡住了,我必须杀死终端或进程才能离开。如果我能在这个二级REPL中使用readline,或者至少可以防止这个常见问题导致我的调试会话脱轨,我非常喜欢。
答案 0 :(得分:3)
你应该使用反叛的readline,一个由bhauman开发的新的replure,同一个人带来的是figwheel。
https://github.com/bhauman/rebel-readline
终端具有rlwrap功能,语法高亮和多行代码编辑功能。
答案 1 :(得分:1)
我不确定rlwrap
实用程序会对那里有帮助,因为内部REPL由外部REPL持有。因此输入由Java代码控制,而不是rlwrap
工具。
由于输入了错误的值,导致异常。我记得,clojure.main/repl
函数可能需要额外的参数来处理异常。也许,您可以以某种方式处理它,而只是打印一个字符串“错误的输入值”。请查看the documentation以获取REPL。
此外,您可以实现自己的REPL进行调试。很久以前,我曾经写过某种东西,这就是我所拥有的:
(defn repl []
(let [input (read)]
(if (= input 'q)
nil
(do
(try
(let [result (eval input)]
(println result))
(catch Exception e
(println e)))
(recur)))))
该函数只是在无限循环中提示正确的Clojure表达式,对其进行求值并打印结果。如果输入错误,则输出错误并继续。要退出REPL,请输入q
。
示例:
(repl)
(+ 1 2) ;; 2
fsdf8 9_fsd ;; prints a stack trace
q ;; returns nil and exit
答案 2 :(得分:1)
尝试使用Cider作为您的repl的Emacs。当您(break)
,您将被赶出Cider repl并进入Emacs Minibuffer,您的标准emacs编辑快捷方式(建立了readline)将继续适用。