#clojure #read-eval-print-loop #leiningen
#clojure #цикл чтения-оценки-печати #leiningen
Вопрос:
Допустим, нам нужно оценить несколько предложений в исходном файле, например
test.clj
@(def x 1)
@(def y 2)
@(def z 3)
Отображается только последняя оценка, если мы явно используем либо clj
или lein repl
,
user => (load-file "test.clj")
3
Мы можем окружить каждый из них, println
чтобы показать их все,
тест-с-println.clj
(println @(def x 1))
(println @(def y 2))
(println @(def z 3))
user => (load-file "test-with-println.clj")
1
2
3
nil
Каковы лучшие альтернативы, чтобы избежать инвазивных println
s по всему исходному коду, в то же время имея возможность распечатать все предполагаемые оценки под эгидой REPL?
@Решение
tap>
Благодаря ответу @Sean Corfield мы можем получить желаемые результаты следующим образом,
- передайте каждый распечатанный подражатель
tap>
.
test-with-tap.clj
(-> @(def x 1) tap>)
(-> @(def y 2) tap>)
(-> @(def z 3) tap>)
- REPLs не получит ни одного из своих выходных данных, пока
tap>
не будет включенadd-tap
.
user=> (load-file "test-with-tap.clj")
nil
user=> (add-tap @(def out (bound-fn* println)))
nil
user=> (load-file "test-with-tap.clj")
1
2
3
user=> (remove-tap out)
nil
user=> (load-file "test-with-tap.clj")
nil
Ответ №1:
tap>
вероятно, это то, что вы ищете — » rel=»nofollow noreferrer»>https://clojuredocs.org/clojure.core/tap> — Это позволяет отправлять полные значения Clojure (а не только строки) в любую функцию, зарегистрированную в качестве прослушивателя, которая может быть чем-то вроде Portal, например — https://github.com/djblue/portal — это то, что я использую весь день, каждый день, но вы также можете использовать что-нибудьтак же просто, как println
add-tap
и для отображения каждого общего tap>
значения.
tap>
Вызовы могут оставаться в вашем коде даже в рабочей среде, поскольку их использование практически не требует затрат.
Хотя tap>
возвращает логическое значение, его можно использовать (doto expr tap>)
для оценки и возврата expr
, но все равно отправлять значение любым прослушивателям tap. tap>
это отличный инструмент для отладки.
Комментарии:
1. Огромное спасибо, Шон. То, что
tap>
предлагает, на удивление, даже лучше, чем я мог себе представить в самом начале.
Ответ №2:
У меня еще не было возможности поиграть tap>
. Моим любимым на протяжении многих лет было spy
семейство функций в библиотеке Tupelo. В частности, проверьте spyx
, spyx-pretty
, и дайте шпионить.
Комментарии:
1. Алан, большое спасибо за ваш ухоженный замечательный проект. Я обязательно добавлю его в инструментарий.