Как я могу получить 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 также будет выводить значения, которые приводят к сбою теста.

Ответы на вопрос(3)

Ваш ответ на вопрос