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*)