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-10-10

Flavorsとデザインパターン - Template Method

| 05:18 | Flavorsとデザインパターン - Template Method - わだばLisperになる を含むブックマーク はてなブックマーク - Flavorsとデザインパターン - Template Method - わだばLisperになる

最近Lispマシンのエミュレータを触ってないので、Flavorsでデザインパターンネタはどうかなと思って書いてみました。

とりあえず先日のTemplate Methodです。

Flavorsは、メソッドがクラス属していて、マルチメソッドでもないので、Javaの例を写すにもなんとなくしっくりくる気もします。

CADRエミュレータのFlavorsは最初期のもので、sendの代わりに<-を使用します。

ちなみに、この時期は、<-とfuncallは同じもので、インスタンスをfuncallしてもOKで、(funcall-self 'key)という構文もあり、(<- self 'key)と同じです。

キーワードに一々quoteを付けないといけないのですが、ソースのコメント等では、quoteは無く、この辺が歴史的変遷というか、謎の一つです。

さらにちなむと、Allegro CLには、Flavorsが付いてくるので、AllegroのFlavorsで遊んでみるのも一興かもしれません。

(defflavor abstract () ())

(defmethod (abstract :template-method) (str)
  (<- self ':op2 (<- self ':op1 str)))

(defflavor concrate () (abstract))

(defmethod (concrate :op1) (str)
  (string-upcase str))

(defmethod (concrate :op2) (str)
  (string-reverse str))

(<- (make-instance 'concrate) ':template-method "foo")
;=> OOF

(defflavor concrate2 () (abstract))

(defmethod (concrate2 :op1) (str)
  (string-pluralize str))

(defmethod (concrate2 :op2) (str)
  (string-reverse str))

(<- (make-instance 'concrate2) ':template-method "foo")

;=> soof