2012-02-17 18 views
4

私は "Practical Common Lisp"を読んでいます。Common LispがDuck Typingをサポートしているかどうかは疑問です。ルビー?Common Lisp Object System(CLOS)はダックタイピングをサポートしていますか?

Rubyでは、呼び出し元が想定している名前と引数リストを持つメソッドを実装している限り、クラスに関係なくオブジェクトに対してメソッドを呼び出すことができます。

CLOSはどうですか?ジェネリック関数がそれに対処すると仮定することによって、クラスを考慮せずにオブジェクトのメソッドを呼び出すことは可能ですか? CLOSはメッセージの受け渡しの哲学に従わず、メソッドがクラスに束縛されていないため、おそらくダックタイピングは不要です。

+1

注意点として、常に対処する関数が必要な場合(関数が見つからないランタイムエラーはありません)、 't'に特化することができます。たとえば、'(defmethod foo((着信オブジェクトt))...) '。 't'は型グラフの先頭です。 (CLtL2の2.15を参照)。 –

+0

はい、わかりました。ありがとう。 –

答えて

13

おそらく、CLOSはメッセージの受け渡しの哲学に従わず、メソッドがクラスにバインドされていないため、ダックタイピングは不要です。

これはまさにそのケースです。すべての汎用関数は、特定のクラスに対して動的に特殊化することができます。デフォルトの実装も可能です。 Lispは動的な型定義を使用するので、どの関数も任意の型の引数で呼び出すことができ、汎用関数の場合は引数の型に基づいたディスパッチ決定は実行時に行われます。

+0

私はクラスが何であるかを考え直す必要があります。 Common Lispでは、クラスはメソッドのセットで定義されていません(通常Javaなどのインターフェースと呼ばれます)。ありがとう。 –

関連する問題