#:g1: Filtered Functions面白そう

Posted 2009-12-05 11:00:00 GMT

今日公開されたFiltered Functionsが面白そうだったので、とりあえず、記念にfizzbuzzしてみました。
詳しくは、
-(http://p-cos.blogspot.com/2009/12/filtered-functions.html)
-(http://common-lisp.net/project/closer/filtered.html)
を参照したり、リンク中の論文のPDFを参照してみてください。

;; ディスパッチの関数を利用する版
(DEFINE-FILTERED-FUNCTION FIZZBUZZ (N)
  (:FILTERS (:FIZZBUZZ
             (LAMBDA (N)
               (COND ((AND (ZEROP (REM N 3))
                           (ZEROP (REM N 5)))
                      'FIZZBUZZ)
                     ((ZEROP (REM N 3))
                      'FIZZ)
                     ((ZEROP (REM N 5))
                      'BUZZ)
                     ('T 'OTHER))))))

(DEFMETHOD FIZZBUZZ :FILTER :FIZZBUZZ ((N (EQL 'FIZZ))) 'FIZZ)

(DEFMETHOD FIZZBUZZ :FILTER :FIZZBUZZ ((N (EQL 'BUZZ))) 'BUZZ)

(DEFMETHOD FIZZBUZZ :FILTER :FIZZBUZZ ((N (EQL 'FIZZBUZZ))) 'FIZZBUZZ)

(DEFMETHOD FIZZBUZZ :FILTER :FIZZBUZZ ((N (EQL 'OTHER))) N)

(KMRCL:FOR (I 1 100)
  (PRINT (FIZZBUZZ I)))
|1 
|2 
|FIZZ 
|4 
|BUZZ 
|FIZZ 
|7 
|8 
|FIZZ 
|BUZZ 
|11 
|FIZZ 
|13 
|14 
|FIZZBUZZ 
|...
;⇒ NIL
;; メソッドコンビネーション風味
(DEFINE-FILTERED-FUNCTION FIZZBUZZ2 (N)
  (:FILTERS (:3 (ZEROP (REM N 3)))
            (:5 (ZEROP (REM N 5)))
            (:3&5 (AND (ZEROP (REM N 5))
                       (ZEROP (REM N 3))))))

(DEFMETHOD FIZZBUZZ2 ((N NUMBER)) N)

(DEFMETHOD FIZZBUZZ2 :AROUND :FILTER :3&5 (N) (DECLARE (IGNORE N)) 'FIZZBUZZ)

(DEFMETHOD FIZZBUZZ2 :AROUND :FILTER :3 (N) (DECLARE (IGNORE N)) 'FIZZ)

(DEFMETHOD FIZZBUZZ2 :AROUND :FILTER :5 (N) (DECLARE (IGNORE N)) 'BUZZ))

(KMRCL:FOR (I 1 100)
  (PRINT (FIZZBUZZ2 I)))
|1 
|2 
|FIZZ 
|4 
|BUZZ 
|FIZZ 
|7 
|8 
|FIZZ 
|BUZZ 
|11 
|FIZZ 
|13 
|14 
|FIZZBUZZ 
|...
;⇒ NIL
CLOS登場の初期には、Filtered Functionsのようにディスパッチの方法/拡張が色々研究されていたようなのですが、これをきっかけにまた色々活発になると面白そうですねー。

comments powered by Disqus