Как я могу получить Clojure: pre &: post, чтобы сообщить об их ошибочной стоимости?
(defn string-to-string [s1]
{:pre [(string? s1)]
:post [(string? %)]}
s1)
Мне нравятся: pre и: post условия, они позволяют мне выяснить, когда я быстрее положил "квадратные колышки в круглые отверстия". Возможно, это неправильно, но мне нравится использовать их как своего рода средство проверки типа бедняков. Это не философия, это простой вопрос.
В приведенном выше коде кажется, что я легко могу определить, чтоs1
является аргументом функции в:pre
состояние. , подобным образом,%
в:post
условие всегда является возвращаемым значением функции.
Я хотел бы напечатать значениеs1
или же%
когда любое из этих соответствующих условий не выполняется в AssertionError. Так я получаю что-то вроде
(string-to-string 23)
AssertionError Assert failed: (string? s1)
(pr-str s1) => 23
С ошибкой AssertionError, содержащей по одной строке для каждой переменной, которая была определена как находящаяся в списке аргументов функции и на которую ссылались в неуспешном тесте. Я также хотел бы что-то подобное, когда возвращаемое значение функции не удается:post
состояние.
Это позволит быстро определить, как я неправильно использовал функцию при попытке диагностировать из ошибки AssertionError. По крайней мере, дало бы мне знать, если значениеnil
или фактическое значение (которое является наиболее распространенной ошибкой, которую я делаю).
У меня есть некоторые идеи, что это можно сделать с помощью макроса, но мне было интересно, существует ли какой-либо безопасный и глобальный способ просто переопределить то, что(defn
а также(fn
а друзья так делают:pre
а также:post
также будет выводить значения, которые приводят к сбою теста.