2011年5月5日木曜日

deftypeとtypecaseを使ってfizzbuzz

Common Lispのdeftypeを利用してみます。

fizz,buzz,fizzbuzzをdeftypeで型として定義して、 typecaseを使って値を判別します。

(defun fizz? (n)
(zerop (mod n 3)))
(defun buzz? (n)
(zerop (mod n 5)))

;;; 型定義
;; fizz型は0以上の整数かつ関数fizz?に引数として渡すと真を返す値であると定義
(deftype fizz ()
'(and (integer 0 *) (satisfies fizz?)))
(deftype buzz ()
'(and (integer 0 *) (satisfies buzz?)))
(deftype fizzbuzz ()
'(and
(integer 0 *)
(satisfies fizz?)
(satisfies buzz?)))

;;; 実効
(loop for i from 1 to 30
do (print
(typecase i
(fizzbuzz 'fizzbuzz)
(fizz 'fizz)
(buzz 'buzz)
(t i))))
;;; 出力
1
2
FIZZ
4
BUZZ
FIZZ
7
8
FIZZ
BUZZ
11
FIZZ
13
14
FIZZBUZZ
16
17
FIZZ
19
BUZZ
FIZZ
22
23
FIZZ
BUZZ
26
FIZZ
28
29
FIZZBUZZ

0 件のコメント:

コメントを投稿