2011-06-21 2 views
4

sicpで機能的な動的ディスパッチを行う方法の1つを読むことが興味深いことがわかりました - フェッチできるタグ+名前 - >関数のテーブルを使用してまたはに追加します。ジェネリック型タグ関数テーブルを猿にパッチする方法

これは動的で非OO言語の典型的なタイプのディスパッチメカニズムですか?

また、テーブルの連鎖リストを使用して、これを猿のパスにする典型的な方法があります(最初のテーブルで見つからない場合は、次のテーブルを再帰的に試してみてください)。ローカルスコープ内のテーブルを変更されたコピーにリバースしますか? ect?

+0

興味深い質問ですが、明確にするために、言語を実装する際に使用される型ディスパッチメカニズム、またはその言語内のデザインパターンとして使用されるタイプのディスパッチメカニズムを意味しますか?そして、例えばScheme/Lispのほかに、あなたが聞いてみたいと思うダイナミックで非OOの言語は何ですか? –

+0

後ろの考えと発展の後ろにある(私は特定のものを考えていない)他の言語のどれか –

+0

私は、スキームでは、言語の設計と有用なパターンの違いは小さいと思った。どちらかに興味がある。 –

答えて

2

これは、this article about the JHC Haskell compilerに基づいた非動的非OO言語であっても、典型的な型ディスパッチメカニズムであり、型クラスをどのように実装するのかと考えています。この記事の意味は、ほとんどのHaskellコンパイラは、辞書を渡すことによって型クラス(型ディスパッチの一種)を実装するということです。彼の選択肢は直接事例分析で、動的な型付き言語には適用されない可能性があります。なぜなら、あなたは式の構成要素のタイプを事前に知っていないからです。一方、これは実行時にも拡張可能ではありません。

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

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

関連する問題