Я думаю, что лучшая библиотека журналов в Clojure в настоящее время - Cambium . Я думаю, что это немного лучше, чем его (более старый) конкурент Тембр .
Чтобы помочь с потоком программ при регистрации или отладке выходных данных функции, я иногда использую небольшой макрос with-result
из Библиотека Тупело . Например:
(is= 42
(with-result 42
(spyx (+ 2 3))))
этот модульный тест показывает, что возвращается результат 42
, хотя самое внутреннее выражение - 5
. Инструмент отладки spyx
(сокращение от «шпионский явный») печатает следующее при запуске теста:
(+ 2 3) => 5
Если вы хотите получить постоянный вывод журнала, используйте Cambium, например:
(log/info "Application started")
(log/info {:args (vec args) :argc (count args)} "Arguments received")
с результатом:
18:56:42.054 [main] INFO myapp.main - Application started { ns=myapp.main, line=8, column=3 }
18:56:42.060 [main] INFO myapp.main - Arguments received { args=["foo" "10"], argc=2, ns=myapp.main, line=9, column=3 }
Я бы немного переписал функцию, чтобы сохранить окончательный результат в переменную, а затем занялся бы регистрацией в одной из 2 форм:
(ns tst.demo.core
(:use tupelo.core tupelo.test)
(:require [cambium.core :as log]))
(defn foo-1 [x]
(let [result (if (neg? x)
(inc x)
x)]
(log/debug (format "foo-1 => %s" result))
result))
(defn foo-2 [x]
(let [new-x (if (neg? x)
(inc x)
x)]
(with-result new-x
(log/debug (format "foo-2 => %s" new-x)))))
(dotest
(is= 42
(with-result 42
(spyx (+ 2 3))))
(is= 2 (foo-1 2))
(is= -1 (foo-1 -2))
(is= 2 (foo-2 2))
(is= -1 (foo-2 -2))
)
, который дает вывод:
-------------------------------
Clojure 1.10.1 Java 13
-------------------------------
Testing tst.demo.core
(+ 2 3) => 5
11:31:47.377 [main] DEBUG tst.demo.core - foo-1 => 2 { ns=tst.demo.core, line=15, column=5 }
11:31:47.378 [main] DEBUG tst.demo.core - foo-1 => -1 { ns=tst.demo.core, line=15, column=5 }
11:31:47.379 [main] DEBUG tst.demo.core - foo-2 => 2 { ns=tst.demo.core, line=23, column=7 }
11:31:47.379 [main] DEBUG tst.demo.core - foo-2 => -1 { ns=tst.demo.core, line=23, column=7 }
Ran 2 tests containing 7 assertions.
0 failures, 0 errors.
Для временных отладочных распечаток я бы сделал это так:
(defn foo [x]
(if (neg? x)
(spyx :foo-inc (inc x))
(spyx :foo-noop x)))
с тестом:
(is= 2 (foo 2))
(is= -1 (foo -2))
и вывод
:foo-noop x => 2
:foo-inc (inc x) => -1
Пример проекта
Вы можете клонировать следующий репозиторий, чтобы увидеть, как все настроено: