ここからの編集して転載。
FizzBuzzの拡張で、3、5以外にも増えたらどうする?
拡張FizzBuzz定義マクロ
(defmacro define-fizzbuzz (fizz-buzz-list) `(defun ,(read-from-string (format nil "~{~a~^-~}" (mapcar #'cdr fizz-buzz-list))) (x) (format nil "~{~a~^~}" (nconc ,@(loop for i in fizz-buzz-list collect `(if (zerop (mod x ,(car i))) (list ',(cdr i)))))) ) ) ;; 使い方 (define-fizzbuzz ((3 . fizz) (5 . buzz))) ; fizz-buzz (define-fizzbuzz ((3 . fizz) (5 . buzz) (7 . foo))) ; fizz-buzz-foo (define-fizzbuzz ((3 . fizz) (5 . buzz) (7 . foo) (11 . bar))) ; fizz-buzz-foo-bar
展開すると、
CL-USER> (macroexpand-1 '(define-fizzbuzz ((3 . fizz) (5 . buzz)))) (DEFUN FIZZ-BUZZ (X) (FORMAT NIL "~{~a~^~}" (NCONC (IF (ZEROP (MOD X 3)) (LIST 'FIZZ)) (IF (ZEROP (MOD X 5)) (LIST 'BUZZ))))) T CL-USER> (macroexpand-1 '(define-fizzbuzz ((3 . fizz) (5 . buzz) (7 . foo)))) (DEFUN FIZZ-BUZZ-FOO (X) (FORMAT NIL "~{~a~^~}" (NCONC (IF (ZEROP (MOD X 3)) (LIST 'FIZZ)) (IF (ZEROP (MOD X 5)) (LIST 'BUZZ)) (IF (ZEROP (MOD X 7)) (LIST 'FOO))))) T CL-USER> (macroexpand-1 '(define-fizzbuzz ((3 . fizz) (5 . buzz) (7 . foo) (11 . bar)))) (DEFUN FIZZ-BUZZ-FOO-BAR (X) (FORMAT NIL "~{~a~^~}" (NCONC (IF (ZEROP (MOD X 3)) (LIST 'FIZZ)) (IF (ZEROP (MOD X 5)) (LIST 'BUZZ)) (IF (ZEROP (MOD X 7)) (LIST 'FOO)) (IF (ZEROP (MOD X 11)) (LIST 'BAR))))) T
一応、実行結果(fizz-buzz-fooのみ)。
CL-USER> (loop for i from 1 to 105 do (format t "~a -> ~a~%" i (fizz-buzz-foo i))) 1 -> 1 2 -> 2 3 -> FIZZ 4 -> 4 5 -> BUZZ 6 -> FIZZ 7 -> FOO 8 -> 8 9 -> FIZZ 10 -> BUZZ 11 -> 11 12 -> FIZZ 13 -> 13 14 -> FOO 15 -> FIZZBUZZ 16 -> 16 17 -> 17 18 -> FIZZ 19 -> 19 20 -> BUZZ 21 -> FIZZFOO 22 -> 22 23 -> 23 24 -> FIZZ 25 -> BUZZ 26 -> 26 27 -> FIZZ 28 -> FOO 29 -> 29 30 -> FIZZBUZZ 31 -> 31 32 -> 32 33 -> FIZZ 34 -> 34 35 -> BUZZFOO 36 -> FIZZ 37 -> 37 38 -> 38 39 -> FIZZ 40 -> BUZZ 41 -> 41 42 -> FIZZFOO 43 -> 43 44 -> 44 45 -> FIZZBUZZ 46 -> 46 47 -> 47 48 -> FIZZ 49 -> FOO 50 -> BUZZ 51 -> FIZZ 52 -> 52 53 -> 53 54 -> FIZZ 55 -> BUZZ 56 -> FOO 57 -> FIZZ 58 -> 58 59 -> 59 60 -> FIZZBUZZ 61 -> 61 62 -> 62 63 -> FIZZFOO 64 -> 64 65 -> BUZZ 66 -> FIZZ 67 -> 67 68 -> 68 69 -> FIZZ 70 -> BUZZFOO 71 -> 71 72 -> FIZZ 73 -> 73 74 -> 74 75 -> FIZZBUZZ 76 -> 76 77 -> FOO 78 -> FIZZ 79 -> 79 80 -> BUZZ 81 -> FIZZ 82 -> 82 83 -> 83 84 -> FIZZFOO 85 -> BUZZ 86 -> 86 87 -> FIZZ 88 -> 88 89 -> 89 90 -> FIZZBUZZ 91 -> FOO 92 -> 92 93 -> FIZZ 94 -> 94 95 -> BUZZ 96 -> FIZZ 97 -> 97 98 -> FOO 99 -> FIZZ 100 -> BUZZ 101 -> 101 102 -> FIZZ 103 -> 103 104 -> 104 105 -> FIZZBUZZFOO