Разработал функцию в Clojure, чтобы проверить, соответствуют ли входы для: maxlength и: minlength длиной 1-3 символа, а текст в ассоциированном столбце находится в пределах min и max. Есть ли более чистый способ сделать это? Я был бы признателен, если предлагается более эффективный метод, особенно форма if.Выполнение сравнения в Clojure
(defn range-text-length
"input = {:col val :minlength minlength :maxlength maxlength}
Expects 3 parameter key/value combinations:
:col The column containing the text value
:maxlength integer value greater than zero up to 3 characters long
Catch any rows where the column contains text that is shorter than the Minimum Length or longer than the Maximum Length"
[row input]
(let [{:keys [col minlength maxlength ]} input
minlength-count (count (str minlength))
maxlength-count (count (str maxlength))
max (read-string (str maxlength))
min (read-string (str minlength))]
(if (and (and (> maxlength-count 0) (<= maxlength-count 3) (number? max) (> max 0))
(and (> minlength-count 0)(<= minlength-count 3)(number? min)(> min 0)))
(and (>= (count (get row col)) min) (<= (count (get row col)) max))
(throw (Exception. "length must be a positive integer value with no more than 3 digits.")))))
И я вызвать функцию таким образом:
(catch-out-of-range-text-length ["weert" "sertt" "qwertyuiopasdfg" "asert"] {:col 2 :minlength 2 :maxlength 15})
Вы можете добавить образец данных? Кроме того, в соответствии с исключением, все столбцы являются числовыми? –
Это действительно работает, просто попросив более чистый способ сделать сравнение в форме if @Frank C. – Jyd
Кандидат должен быть перемещен в codereview –