メソッドを定義するには - lisp-cookbook-ja/common-lisp GitHub Wiki

オブジェクトシステム(CLOS)

メソッドを定義するには

標準のCLOSでのメソッドの定義とは総称関数を定義することになり、defgenericdefmethod を使用して定義します。

CLOSの特徴としてメソッドが特定のクラスに属していないことが挙げられますが、メソッドは通常 defclass で定義する standard-object のオブジェクト以外にも、built-in-class (リストやベクタ、数値等々)、 structure-class(構造体) にも定義することが可能です。

また、EQLスペシャライザ(特定子)により特定のオブジェクトそのものに対してメソッドを設定することも可能です。

(defclass foo () ())                    ;fooクラス
(defstruct foo-struct)                  ;構造体

(defgeneric foo (obj))                  ;総称関数を定義

;; fooクラス
(defmethod foo ((x foo))
  "foo class!")

;; foo-struct構造体
(defmethod foo ((x foo-struct))
  "foo struct!")

;; built-in-class float
(defmethod foo ((x float))
  "float!")

;; built-in-class function
(defmethod foo ((x function))
  "function!")

;; eql特定子
(defmethod foo ((x (eql 1)))
  "one!")

;;; 試してみる
(let ((a (make-instance 'foo))
      (b (make-foo-struct))
      (c pi)
      (d #'car)
      (e 1))
  (mapcar #'foo (list a b c d e)))
;=> ("foo class!" "foo struct!" "float!" "function!" "one!")