Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2008-11-13

MOPでFizzBuzz

| 23:17 | MOPでFizzBuzz - わだばLisperになる を含むブックマーク はてなブックマーク - MOPでFizzBuzz - わだばLisperになる

今日は、数理システムユーザーコンファレンス2008の一日目、MOP (Metaobject Protocol) in One Dayに参加してきました。

6時間に渡ってMOPを解説するという稀にみるに濃いセミナーでしたが、この濃いセミナーに40人もの人が集まっていました。凄い!

内容としては、丁寧に進められて行った感じなのでMOPに興味のある方には非常に有意義だったのではないかと思います。

また、量が多いので一度では無理ですが、自分の中で今回のセミナーの内容を纏めて随時エントリに書いて行こうかなとも思っています。

とりあえず、記念にMOPでFizzBuzzを書いてみました。

ちなみに、カウンタのリセットの方法が分かりません。

;; 補助定義
;; 型を定義して型で振り分けてみる(MOPに関係なし)
(defun fizzp (n) (zerop (rem n 3)))
(deftype fizz () '(satisfies fizzp))
(defun buzzp (n) (zerop (rem n 5)))
(deftype buzz () '(satisfies buzzp))
(deftype fizzbuzz () '(and fizz buzz))
;; メタクラスの作成
(defclass fizzbuzz-meta (standard-class)
  ((counter :initform 1)))

;; fizz buzzに応じてmake-instanceの挙動が変わるように定義
(defmethod make-instance :around ((metaclass fizzbuzz-meta) &key)
  (with-slots (counter) metaclass
    (prog1 (typecase counter
             (fizzbuzz "Fizz Buzz")
             (fizz "Fizz")
             (buzz "Buzz")
             (otherwise (call-next-method)))
      (incf counter))))

;; SBCLでは、validate-superclassの定義が必要
(defmethod sb-mop:validate-superclass ((class fizzbuzz-meta)
                                       (super standard-class))
  'T)

;; 通常のclassのようにfooを定義(ただしメタクラスは、fizzbuzz-meta)
(defclass foo () ()
  (:metaclass fizzbuzz-meta))
;; 実行/3と5の倍数以外でしか正常に機能しないmake-instanceが完成
(dotimes (i 100)
  (format T "~A~%" (make-instance 'foo)))

;>>>
#<FOO {100AA33881}>
#<FOO {100AA34471}>
Fizz
#<FOO {100AA35881}>
Buzz
Fizz
#<FOO {100AA37821}>
#<FOO {100AA38471}>
Fizz
Buzz
#<FOO {100AA3A361}>
Fizz
#<FOO {100AA3B821}>
#<FOO {100AA3C471}>
Fizz Buzz
#<FOO {100AA3D881}>
#<FOO {100AA3E471}>
Fizz
...