В качестве модельной задачи представим что у нас есть некоторая форма регистрации:
+----------------------------------------+
| Registration form |
| |
| +---------------+ |
| электронная почта | | |
| +---------------+ |
| |
| +---------------+ |
| пароль | | |
| +---------------+ |
| |
| +---------------+ |
| подтверждение пароля | | |
| +---------------+ |
| |
| /----------\ |
| | Register | |
| \----------/ |
+----------------------------------------+
(define-form register ("Registration form")
((define-field email () "Электронная почта")
(define-field password (:type "password") "Пароль")
(define-field confirm (:type "password") "Подтверждение пароля")
(define-button register () "Зарегистроваться")))
Теперь мы хотим чтобы кнопка “Зарегистрироваться” была недоступна, если поля формы не содержат корректное значение (чтобы это не значило) Опишем, что статус кнопки зависит от полей:
(define-button register
(:status (if (reduce #'(lambda (acc x)
(and (is-correct acc)
(is-correct x)))
(list email password confirm))
:enabled
:disabled))
"Зарегистроваться")
Какие-же значения считать корректными? Ну, например, пароль никак не может быть пустым, так и запишем:
(defmethod is_correct ((field password))
(not (is_empty (get-value field))))
Подтверждение пароля помимо этого должно совпадать с паролем:
(defmethod is_correct ((field confirm))
(and (not (is_empty (get-value field)))
(equal (get-value field)
(get-value (get-field confirm)))))
Ну а email должен быть не зарегистрирован:
(defmethod is_correct ((field email))
(and (not (is_empty (get-value field)))
(not (is-registered-email (get-value field)))))