Common Lisp クックブック
8 followers 0 articles/week
[CLOSチュートリアル] 4.2. defmethod マクロ

CLOSで、型を基準にした制御を定義するマクロが defmethod です。次に例を示します。 ; my-describe を未束縛にする CL-USER 57 > (fmakunbound 'my-describe) MY-DESCRIBE ; my-describe を再定義する CL-USER 58 > (defmethod my-describe (thing) (format t "~s could be anything, for all I care." thing)) #<STANDARD-METHOD MY-DESCRIBE NIL...

Wed Jun 19, 2013 23:14
[CLOSチュートリアル] 4.3. 総称関数と次メソッド

総称関数は、メソッドの組み合わせと協調して動作する関数です。総称関数が起動されると、メソッドのディスパッチを行います。同じ名前を持つすべてのメソッドは、同名の総称関数に属します。 my-describe のメソッドを最初に定義したとき、同名の総称関数が暗黙のうちに生成されました。同名のメソッドを追加定義するまで、その総称関数が持つメソッドは一つだけです。 実装についての覚え書き:次の例で使っている generic-function-methods 関数と method-generic-function 関数は、Common Lispの仕様ではありません。LispWorksではデフォルトのパッケージ(package-use-list 内のパッケージ)に含まれ、Allegro CLではデフォルトでロードされる...

Wed Jun 19, 2013 23:14
[CLOSチュートリアル] 4.4. すべてはオブジェクトの中にある

すべてはオブジェクトの中にある -- こんなバカバカしい思想は妄想の産物です。しかしオブジェクトシステムの多くはそう思い込もうとしていますし、理論武装もしています。CLOSもオブジェクトシステムの一つとして、その考えとぶつかってみましょう。 CLOSから見た真実はこうです。アプリケーションは関数とメソッド(スロットのアクセサを除く)で形作られるものであって、クラスによるものではありません。 クラスを定義したファイルに、そのクラスに適用可能なメソッドを書くこともあります。総称関数が持つすべてのメソッドを一つのファイルに書くこともあります。CLOSには言語による制限がありません。 この節のタイトルはメッセージ送信の概念とも関係があります。メッセージ送信の概念は、一つ目の引数(レシーバ)によってメソッドを決めるオブジェクトシステムから来ています。この引数が言語の特徴で、関数呼び出しの構文をその特徴に合わせると次のようになります。 Eric<-(my-describe) これは...

Wed Jun 19, 2013 23:14
[CLOSチュートリアル] 4.5. その他の特定子(まだCLOSオブジェクトは不要です)

これまでに挙げたメソッドの例では、すべて standard-class クラスのサブクラスを特定子としていました。しかしそうでなくても、どんなCLOSクラスでも特定化することができます。例えば3.4節で挙げたクラスや、構造体クラスです。 ; 構造体クラスを特定子とする CL-USER 69 > (defmethod my-describe ((self structure-object)) (format t "~s is a structure object." self)) #<STANDARD-METHOD MY-DESCRIBE NIL (STRUCTURE-OBJECT) 205F5744> ...

Wed Jun 19, 2013 23:14
[CLOSチュートリアル] 4.6. 修飾子とメソッド結合

はじめに一言。たいした思案もなしにメソッド結合を使うのは、手放しで多重継承を使うようなもので、あっと言う間にコードを把握できなくなります。 defmethod の完全な文法を次に示します。 defmethod function-name {method-qualifier}* specialized-lambda-list declaration* | documentation? form* ここでは defmethod をいつも通りに使うか、標準メソッド結合 (standard method combination)の定義に使うかだけを見ていきます(その他のメソッド結合もありますし、自分で新しいメソッド結合を定義することもできますが、そこまでした人を見たことはありません)。標準メソッド結合では、次のキーワードのうち一つだけ指定できます::before,...

Wed Jun 19, 2013 23:14

Build your own newsfeed

Ready to give it a go?
Start a 14-day trial, no credit card required.

Create account