4

sicpで機能的な動的ディスパッチを実行できる方法の1つを読むのは興味深いと思いました。タグ+名前のタイプのテーブルを使用して->フェッチまたは追加できる関数を使用します。

私は疑問に思っていました、これは動的な非OO言語の典型的なタイプディスパッチメカニズムですか?

また、テーブルの連鎖リストを使用して、これをモンキーパスする一般的な方法は何でしょうか(最初のテーブルに見つからない場合は、次のテーブルを再帰的に試してください)。ローカルスコープ内のテーブルを変更されたコピーに再バインドしますか?電気ショック療法?

4

1 に答える 1

2

これは、JHC Haskellコンパイラとそれが型クラスを実装する方法に関するこの記事に基づいて、非動的な非オブジェクト指向言語であっても、典型的な型ディスパッチメカニズムであると思います。この記事の意味するところは、ほとんどのHaskellコンパイラーが辞書を渡すことによって型クラス(型ディスパッチの一種)を実装しているということです。彼の代替案は直接の事例分析であり、表現の構成要素のタイプが何であるかを事前に知らないため、動的に型付けされた言語には適用できない可能性があります。一方、これは実行時にも拡張できません。

動的な非オブジェクト指向言語に関しては、Lisp/Scheme以外の多くの例を私は知りません。Common LispのCLOSは、Lispを適切なオブジェクト指向言語にし、動的ディスパッチと複数のディスパッチを提供します(実行時にジェネリックとメソッドを追加または削除でき、最初のパラメーター以外のタイプをキーオフできます)。これが通常どのように実装されるかはわかりませんが、通常、組み込み機能ではなくアドオン機能であることがわかります。これは、モンキーパッチャーになる予定のユーザーが利用できる機能を使用していることを意味します。特定のバージョンは速度の欠如で批判されています(CLISP、私は思いますが、彼らはこれを解決したかもしれません)。もちろん、このタイプの並列ディスパッチメカニズムをオブジェクト指向言語内に実装することもできます。おそらくその例をたくさん見つけることができます。

純粋関数型の永続マップまたは辞書を使用している場合は、継承されたマップのチェーンを必要とせずに、この機能を確実に実装できます。マップを「変更」すると、新しいマップが返されますが、古いマップへの既存の参照はすべて有効であり、古いバージョンとして表示されます。この機能を使用して言語を実装している場合は、type-> function mapをReaderモナドに配置し、インタプリタをラップすることで、言語を解釈できます。

于 2011-07-14T18:22:34.273 に答える