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Полезное
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Полезное
Ваше упражнение проверяется по этим тестам
(ns atoms-validation-test
(:require [test-helper :refer [assert-solution]]
[index :refer [vec-even?]]))
(assert-solution
[[[0 2 4 6]] [[1 3 5]] [[]] [[0 2 4 5]] [[2]]]
[true false false false true]
vec-even?)Решение учителя откроется через:
20:00
