Как я могу получить readline/rlwrap-подобные функциональные возможности при использовании clojure.main/repl?
Как я могу получить подобную readline (или rlwrap-подобную) функциональность из моего REPL, когда я использую repl
функция отclojure.main
?
Основанием для этого является то, что я использую и настраиваю break
функция от Радости Clojure, Первое издание. Я использую это изнутри lein repl
РЕПЛ. Когда моя "точка останова" срабатывает, функция readline-подобной функции REPL Лейнингена исчезает, что отчасти неудобно. Моя мышечная память заставляет меня бить ↑, а затем быстро вводить. Прежде чем я могу остановить себя, у меня есть это в моем терминале:
debug=> ^[[A
CompilerException java.lang.RuntimeException: Unable to resolve symbol: in this context, compiling:(/tmp/form-init13211381000659590518.clj:1:1)
И теперь мой REPL застрял, и мне нужно убить терминал или процесс, чтобы выйти. Я бы очень хотел, чтобы я мог либо заставить readline работать в этом REPL второго уровня, либо хотя бы предотвратить срыв этой общей проблемы с моих сеансов отладки.
3 ответа
Вы должны использовать rebel readline, новый репл для clojure, разработанный bhauman тем же парнем, который привел это figwheel.
https://github.com/bhauman/rebel-readline
Он имеет функции rlwrap, подсветку синтаксиса и многострочное редактирование кода в терминале.
Попробуйте Emacs с Cider в качестве вашего repl. Когда ты (break)
вы будете вытеснены из реплик Cider в минибуфер Emacs, где продолжают действовать ваши стандартные ярлыки редактирования emacs (на которых смоделирована readline).
Я не уверен rlwrap
в этом поможет утилита, потому что внутренний 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