2016-08-15 12 views
1

任意のオブジェクトを頂点として格納するグラフデータ構造を実装しています。すべての頂点がキーを持つようにオブジェクトのキーを取得するようなインターフェースを定義したいと思います。私の考えでは、これはjavaのような言語でインターフェースを使う場所のように聞こえます。共通のlispで記述し実装する方法

interface Vertex { 
    String key (Vertex v); 
    // etc... 
} 

共通のlispでインターフェイスの動作をエミュレートするにはどうすればよいですか?

+7

ミックスインのようなクラスを実装して、汎用関数を継承したり定義したりするだけです。 CLOSには複数の継承があります。 –

答えて

5

Rainer Joswig mentioned in the commentsとしては、いくつかの言語(Javaなど)を使用するという意味ではインターフェイスがないため、いくつかの汎用関数を定義する必要があります。オプションで、クラスを実装するスーパークラス。

+0

私は面白いと思うことは、クラスがインタフェースを実装しているかどうかチェックすることです。 CLOSのようなシステムでは、クラスとは別にメソッドを定義することができます(通常は実際に実行されています)。クラスの最初のインスタンスが作成されるまで、そのようなチェックを遅らせる必要があります。ただし、チェックを行うにはMOPpyのやり方をするのは簡単なはずです。 – tfb

+0

@tfb:一般的な機能は多かれ少なかれ、その概念を逆さまにしています。むしろ、あなたはこのジェネリックメソッドがそのクラスを含む専門化を持っているかどうか尋ねることを意味しますか? FIND-METHODはその質問に答えます。例えば、(find-method# 'stream-clear-output'()(list(find-class 'stream)) – BRFennPocock

+0

@tfbこれはmixinクラスを使う点です。 (メソッドのデフォルトの実装を除いて、人は通常、インタフェースではなくこれらの抽象クラスを呼び出します) –