DRY up your Enumerations in Common Lisp

http://www.devchix.com/2007/05/25/ruby-dry-up-your-enumerations/

Common Lispならマクロの出る幕すらない。

(defstruct stooge :name :hair :habit)

(defparameter *stuff*
  (vector
   (make-stooge :name "Mo" :hair "bowly" :habit "eye poking")
   (make-stooge :name "Larry" :hair "curly" :habit "whomping")
   (make-stooge :name "Curly" :hair nil :habit "whining")))

(defun baldish? (x)
  (null (stooge-hair x)))

(defun is (field value)
  (lambda (stooge)
    (equal (slot-value stooge field) value)))

(defun name-is (value)
  (is :name value))

(defun defalias (new func)
  (setf (symbol-function new) func))

(defalias 'select #'remove-if-not)

;; @stooges.that.are.baldish?
(select #'baldish? *stuff*)

;; @stooges.that.have.name == ‘Mo’
(remove-if-not (lambda (x) (equal (stooge-name x) "Mo")) *stuff*)
(select (name-is "Mo") *stuff*)

;; @stooges.extract.name
(map 'vector #'stooge-name *stuff*)

;; @stooges.all.are.baldish?  # false
(every #'baldish? *stuff*)

;; @stooges.any.are.baldish?  # true
(some #'baldish? *stuff*)

;; @stooges.all.are_not.baldish?  # false
(every (complement #'baldish?) *stuff*)

;; @stooges.any.are_not.baldish?  # true
(some (complement #'baldish?) *stuff*)

;; @stooges.all.have.name == ‘Mo’  # false
(every (name-is "Mo") *stuff*)

;; @stooges.any.have.name == ‘Mo’  # true
(some (name-is "Mo") *stuff*)