;;;; 1 (defgeneric token-identifier-p (token)) (defgeneric token-keyword-p (token)) (defgeneric token-selector-p (token)) (defgeneric token-statement-separator-p (token)) ;;; ... about 10-15 predicates total ;;;; vs. 2 (defgeneric token-kind-p (token kind) (:method :before (token kind) (check-valid-token-kind token kind)) (:method (token kind) (eq (token-kind token) kind))) (defun check-valid-token-kind (token kind) (assert (member kind '(identifier keyword selector ;; ... some omitted statement-separator)))