Clojure プロトコルはどの言語のどの機能から派生していますか?
注: これは「プロトコルの使用方法」に関する質問ではありません。
これは、アイデアのきっかけとなったものについての質問です。
特に、私が欲しいのは次のようなものを取得することです:
- XYZ + ABC にインスパイアされた Clojure プロトコル
次に、人々が XYZ と ABC を使用して言語機能にアクセスした方法について読むことができます。
ありがとう!
Clojure プロトコルはどの言語のどの機能から派生していますか?
注: これは「プロトコルの使用方法」に関する質問ではありません。
これは、アイデアのきっかけとなったものについての質問です。
特に、私が欲しいのは次のようなものを取得することです:
次に、人々が XYZ と ABC を使用して言語機能にアクセスした方法について読むことができます。
ありがとう!
Java を知っている場合、Clojure プロトコルは Java インターフェースに似ていますが、より優れています。ClojureのWeb サイトでは、プロトコルについて次のように説明されています (そのページには、プロトコルに関する背景情報と理論的根拠がさらに記載されています)。
- インターフェイスの代替として、高性能で動的なポリモーフィズム コンストラクトを提供する
- インターフェイスの優れた部分をサポート
- 仕様のみ、実装なし
- 単一のタイプで複数のプロトコルを実装できます
- いくつかの欠点を回避しながら
- どのインターフェースを実装するかは、型作成者の設計時の選択であり、後で拡張することはできません (ただし、インターフェース注入は最終的にこれに対処する可能性があります)。
- インターフェイスを実装すると、isa/instanceof タイプの関係と階層が作成されます
- さまざまな関係者による、型のセット、プロトコル、および型に対するプロトコルの実装の独立した拡張を許可することにより、「式の問題」を回避します。
- ラッパー/アダプターなしでそうする
- より高いレベルの抽象化/編成を提供しながら、マルチメソッド (型の単一ディスパッチ) の 90% のケースをサポートします
さらに、 Solving the Expression Problem with Clojure 1.2を読むと興味深いかもしれません。
Clojure の専門家である Stuart Sierra が、古典的なプログラミングのジレンマである Expression Problem を解決する Clojure 1.2 の新機能を紹介します。プロトコルを使用すると、既存の型を新しいメソッドに拡張でき、データ型を使用すると、既存のメソッドを新しい型に拡張できます。既存のコードを変更する必要はありません。また、Java™ インターフェースおよびクラスが Clojure プロトコルおよびデータ型とどのように対話できるかについても説明します。
Clojure プロトコルは、式の問題を解決したいという願望を除いて、何かに触発されたのかわかりませんが、たとえば、プロトコルは Haskell 型クラスと同様のことを行っています...
詳細については、この質問を参照してください。Scala traits についても言及されています。