13

repl当我使用来自的函数clojure.main时,如何从我的 REPL 中获得类似 readline(或类似 rlwrap)的功能?

这样做的背景是我正在使用和自定义Clojure 的乐趣,第一版中的break函数。我在lein replREPL 内部使用它。当我的“断点”启动时,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 卡住了,我必须终止终端或进程才能退出。如果我可以让 readline 在这个二级 REPL 中工作,或者至少防止这个常见问题使我的调试会话脱轨,我非常希望。

4

3 回答 3

3

你应该使用 rebel readline,一个由 bhauman 开发的新的 clojure repl,带来的是 figwheel。

https://github.com/bhauman/rebel-readline

它在终端中具有 rlwrap 功能、语法突出显示和多行代码编辑。

于 2018-03-18T00:23:46.200 回答
1

尝试使用Cider作为您的副本的 Emacs。当您(break)从 Cider repl 中跳出并进入 Emacs Minibuffer 时,您的标准 emacs 编辑快捷方式(在其上模拟 readline)继续适用。

于 2018-01-19T00:02:13.273 回答
1

我不确定该rlwrap实用程序会在那里提供帮助,因为内部 REPL 由外部 REPL 持有。所以输入是由 Java 代码控制的,而不是rlwrap工具。

由于输入了错误的值,因此导致异常。我记得,该clojure.main/repl函数可能需要一个额外的参数来处理异常。也许,您可以以某种方式处理它,而只需打印一个字符串“错误的输入值”。查看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
于 2018-01-17T07:57:03.997 回答