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-12-17

12/20〜1/13 第25〜31回 慢性的CL勉強会@Lingr8時だョ!全員集合告知

| 10:33 | 12/20〜1/13 第25〜31回 慢性的CL勉強会@Lingr8時だョ!全員集合告知 - わだばLisperになる を含むブックマーク はてなブックマーク - 12/20〜1/13 第25〜31回 慢性的CL勉強会@Lingr8時だョ!全員集合告知 - わだばLisperになる

一ヶ月ぶりの告知です。

開催が停滞していましたが、毎週土曜日に集って頂ける方は一定数いらっしゃり、開催しないのももったいないので毎週開催することとしてみました。

ということで1月末までどかんと、第31回目までの告知です。

12/20 第25回

12/27 第26回

1/ 3 第27回

1/10 第28回

1/17 第29回

1/24 第30回

1/31 第31回

という風に年末年始も世間の流れとは関係なく開催致します!

大体の構成ですが、序盤30分から1時間は、実践(Practical) Common Lispを読むこととしたいと思います。

後半の1時間程度は、都度変えていこうかと思います。

場所:Lingr: Common Lisp部屋
日時12/20〜1/31(土)まで毎週土曜 20:00から21:00位まで(途中参加/離脱/ROM歓迎)
お題実践(Practical) Common Lispを読む+α
勉強会の目標CLに関して一つ位賢くなった気になること

勉強会のネタがあれば、このブログにコメント頂くか、Lingr等に書き置きしてみて下さい。好きなテーマを持ち込んでみて頂くというのも大歓迎です!

CLとデザインパターン - Visitor

| 10:15 | CLとデザインパターン - Visitor - わだばLisperになる を含むブックマーク はてなブックマーク - CLとデザインパターン - Visitor - わだばLisperになる

今回はVisitorです。

Norvig氏のDesign Patterns in Dynamic Programmingでは、ファーストクラスの関数で対処可能。Greg Sullivan氏のGOF Design Patterns in a Dynamic OO Languageによれば、多重ディスパッチで解決できるとのこと。自分の感じだと、どちらかというとVisitorという名前からしてファースト・クラスの関数を引数に与えて内部で実行という方がしっくり来ます。

とりあえず、普通のものと、多重ディスパッチのものと2つ書いてみました。

;; aceptor
(defclass fruit-shop () 
  ((fruit :initform '("リンゴ" "ミカン" "バナナ") :reader fruit)))

(defclass fruit-shop2 (fruit-shop) 
  ((fruit :initform '("いちご" "キウイ" "メロン") :reader fruit)))

;; visitor
(defclass salesman () 
  ((fruit-shop :accessor fruit-shop)))

(defgeneric bargain-sale (salesman)
  (:method ((salesman salesman))
    (format T "~{~Aが安いよ!~%~}" (fruit (fruit-shop salesman)))))

(defgeneric ask-visitor (fruit-shop salesman))

;; single dispatch
(defmethod ask-visitor ((fruit-shop fruit-shop) salesman)
  (setf (fruit-shop salesman) fruit-shop)
  (bargain-sale salesman))

(defclass salesman2 (salesman) ())

(defmethod bargain-sale ((salesman salesman2))
  (format T "~{~Aがとんでもなく安いよ!~%~}" (fruit (fruit-shop salesman))))

;;; 実行してみる
(let ((fs (make-instance 'fruit-shop))
      (v (make-instance 'salesman)))
  (ask-visitor fs v))
;-> リンゴが安いよ!
;   ミカンが安いよ!
;   バナナが安いよ!
;=> NIL

(let ((fs (make-instance 'fruit-shop))
      (v (make-instance 'salesman2)))
  (ask-visitor fs v))

;-> リンゴがとんでもなく安いよ!
;   ミカンがとんでもなく安いよ!
;   バナナがとんでもなく安いよ!
;=> NIL

(let ((fs (make-instance 'fruit-shop2))
      (v (make-instance 'salesman2)))
  (ask-visitor fs v))
;-> いちごがとんでもなく安いよ!
;   キウイがとんでもなく安いよ!
;   メロンがとんでもなく安いよ!
;=> NIL

;; ==========================
;; 多重ディスパッチ版
(defclass fruit-shop () 
  ((fruit :initform '("リンゴ" "ミカン" "バナナ") :reader fruit)))

(defclass fruit-shop2 (fruit-shop) 
  ((fruit :initform '("いちご" "キウイ" "メロン") :reader fruit)))

(defclass salesman-md () ())
(defclass salesman-md2 (salesman-md) ())

(defgeneric bargain-sale-md (salesman-md fruit-shop))
(defmethod bargain-sale-md ((s salesman-md) (fs fruit-shop))
  (format T "~{~Aが安いよ!~%~}" (fruit fs)))
(defmethod bargain-sale-md ((s salesman-md2) (fs fruit-shop))
  (format T "~{~Aがとんでもなく安いよ!~%~}" (fruit fs)))
(defmethod bargain-sale-md ((s salesman-md) (fs fruit-shop2))
  (format T "~{~Aが新鮮だよ!~%~}" (fruit fs)))
(defmethod bargain-sale-md ((s salesman-md2) (fs fruit-shop2))
  (format T "~{~Aがとんでもなく新鮮だよ!~%~}" (fruit fs)))

(let ((fs (make-instance 'fruit-shop))
      (s (make-instance 'salesman-md)))
  (bargain-sale-md s fs))
;-> リンゴが安いよ!
;   ミカンが安いよ!
;   バナナが安いよ!
;=> NIL

(let ((fs (make-instance 'fruit-shop2))
      (s (make-instance 'salesman-md2)))
  (bargain-sale-md s fs))
;-> いちごがとんでもなく新鮮だよ!
;   キウイがとんでもなく新鮮だよ!
;   メロンがとんでもなく新鮮だよ!
;=> NIL

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20081217