2012-02-22 14 views
2

Common Lispで、一人の「小さなインターフェース実装者」のために、Javaで匿名クラスを定義するための母国語はありますか?例えば匿名CLOSインスタンス

this.addListener(new Listener() { 
    public void listen() {...} 
}); 

:Common Lispの方法で

(defgeneric listen (object)) 

(add-listener #<this> 
    (make-anonymous-instance 
    (listen (object) ...))) 

答えて

7

したがって、匿名のインスタンスは本当に意味がありませんが、一般的な機能ではなく、クラスに属しています。特定の状況、トラフクロージャまたはEQLスペシャライザに応じて、同様の目的を達成できます。コメントするに応じて拡張

をトップレベルでのCLメソッドの定義ではないでは本当に良いアイデアではないことは可能ですが、。実際のインスタンスが必要ない場合は、通常はメソッドを追加するか、シンボルやその他の定数に特化したEQLを追加することをお勧めします。

ビヘイビアをインラインで定義する方が便利な場合は、インターフェイスが誤って設計されていることを示し、オブジェクトではなくクロージャを使用する必要があります。インターフェイス自体を修正できない場合は、クロージャをラップし、そのクロージャを呼び出すメソッドを追加するだけの目的のクラスを定義してから、適切な動作をスロットに挿入してインスタンスを作成します。

+0

[OK]を、それが理にかなって、とても感謝します。私はジェネリック関数へのメソッドの関係を理解し​​ています。元の例で '#'で表されるインスタンスが「add-listenerによって追加されたリスナーでリスンする」というジェネリック関数を呼び出す場合、あなたは何を提案しますか? – nowbumja

2

本当にありません。 MOPといくつかのマクロ学では可能かもしれないが。

CLOSの開発の初期段階では、GENERIC-FLETのようなものが提案されました。しかしそれはそれを基準にしなかった。

2

Javaの匿名クラスは、ほとんどの場合、匿名関数とクロージャを実装するために使用されます。 Common Lispでは、関数がCommon Lispのファーストクラスの型であるため、Javaの匿名の内部クラスをエミュレートする必要はありません。

このような場合は、その後、Common Lispの中のコードは次のようになります。

(add-listener self (lambda (object) ...))