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-05-19

構造体と総称関数の組み合わせ

| 07:16 | 構造体と総称関数の組み合わせ - わだばLisperになる を含むブックマーク はてなブックマーク - 構造体と総称関数の組み合わせ - わだばLisperになる

bit別冊 Common Lisp オブジェクトシステム - CLOSとその周辺を読んでいて、defmethodとdefstructを組み合わせる例が紹介されていたので試してみます。

なんだか関係のないところに力が入ってしまいましたが、CLでは、クラスと型が融合していて、defstructで作った型も引数特定子として扱えるということが本題です…。

(setq ガガンボ (make-双翅目))
(setq オニヤンマ (make-蜻蛉目))
(setq なんらかの虫 (make-昆虫))

(昆虫の足の数 ガガンボ)
;=> 6

(昆虫の足の数 オニヤンマ)
;=> 6

(双翅目の足の数 ガガンボ)
;=> 6

(双翅目の翅の数 ガガンボ)
;=> 2

(虫博士 なんらかの虫)
;=> 昆虫は足が6本だけど、そんな虫知らない。

(虫博士 ガガンボ)
;=>昆虫は足が6本、双翅目は、翅が2枚なんだ。

(虫博士 オニヤンマ)
;=>昆虫は足が6本、蜻蛉目は、翅が4枚なんだ。

(虫博士 'foo)
;=> それは虫じゃないね。

;; 定義
(defstruct (昆虫 (:conc-name "昆虫の"))
  (足の数 6))

(defstruct (双翅目 (:include 昆虫) (:conc-name "双翅目の"))
  (翅の数 2))

(defstruct (蜻蛉目 (:include 昆虫) (:conc-name "蜻蛉目の"))
  (翅の数 4))

(defmethod 虫博士 ((虫 双翅目))
  (format t "昆虫は足が6本、~Aは、翅が~D枚なんだ。~%" 
	  (type-of 虫) (双翅目の翅の数 虫)))

(defmethod 虫博士 ((虫 蜻蛉目))
  (format t "昆虫は足が6本、~Aは、翅が~D枚なんだ。~%" 
	  (type-of 虫) (蜻蛉目の翅の数 虫)))

(defmethod 虫博士 ((虫 昆虫))
  (format t "昆虫は足が6本だけど、そんな虫知らない。~%"))

(defmethod 虫博士 (虫)
  (format t "それは虫じゃないね。~%"))