Бесплатный курс по clojure. Зарегистрируйтесь для отслеживания прогресса →

Clojure: Валидация атомов

Еще одной из удобных возможностей атомов - валидация. Рассмотрим на примерах:

(def my-atom (atom 0 :validator even?)) ; создаем атом, который валидирует свое состояние на четность

@my-atom ; => 0

(swap! my-atom inc) ; увеличиваем значение атома на единицу
IllegalStateException Invalid reference state  clojure.lang.ARef.validate (ARef.java:33)

(swap! my-atom (partial + 2)) ; увеличим атом на 2

@my-atom ; => 2

Как видно из примера, при попытке изменить атом на некорректное значение, бросается исключение об ошибке изменения. Функция-валидатор может быть какой-угодно, главное, чтобы она принимала один аргумент, само значение атома, а возвращать boolean или выбрасывать исключение, которое описывает ошибку валидации (исключения в Clojure обрабатываются так же, как и в большинстве других языков).

Задание

Реализуйте функцию-валидатор vec-even, которая проверяет, что атом является вектором и все его элементы четные (пустой вектор не является валидным случаем).

(vec-even [])        ; => false
(vec-even [0 2 4 6]) ; => true
(vec-even [1 3 5])   ; => false

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются https://github.com/hexlet-basics
Если вы столкнулись с трудностями и не знаете, что делать, задайте вопрос в нашем большом и дружном сообществе