15

私はF#3.0タイプのプロバイダー(たとえばここ)について読んでいますが、それらは一種のコンパイル時のコード生成に基づいているようです。その点で、私はそれらがLispマクロとどのように比較されるのか疑問に思いました。F#3.0タイププロバイダーとLispマクロの両方で、ユーザーコードをコンパイル時に実行し、コンパイラーで使用できる新しいタイプを導入できるように思われます。誰かが問題と関連するニュアンスに光を当てることができますか?

4

4 に答える 4

11

F#タイププロバイダーと他の言語のメタプログラミング手法の間にはいくつかの重複がありますが、ダニエルにはあま​​り共通点がないことに同意します。F#には、おそらくLISPマクロに近い引用符のような他のメタプログラミング手法がいくつかあります。

特に:

  • LISPマクロは通常、式を変換するために使用されます(LISP式を取得して解釈するか、変換してから実行することができます)。変換は入力としてLISP式を受け取ることに注意してください。一方、型プロバイダーは非常に限られたパラメーター(文字列、整数)しか受け取ることができません。

  • 引用はもっと似ています。これらはF#式の処理に使用できます。F#コードの一部をデータとして扱い、それを解釈または変換することができます。変換はF#式(のサブセット)を取りますが、通常はそれを実行しません。

  • タイププロバイダーは、純粋にタイプを生成するために使用されます。LISPは動的に型付けされるので、これはLISPで発生するような問題ではありません。ただし、これは一種のコード生成です(LISPで確実に実行できるメタプログラミングの形式)。

于 2012-08-24T20:55:10.327 に答える
7

F#タイププロバイダーの興味深い側面は、コンパイル時だけでなく、設計時、つまり完全なIDEツールと相互作用する方法で機能することです。タイププロバイダーは、外部のスキーマ化されたデータソースから「タイプ」を提供しますが、実装メカニズムにより、IntelliSense(識別子のオートコンプリート)、ドキュメント、データツールチップなど、多くのIDEツールも使用可能になります。インタラクティブREPLと組み合わせると、簡単に探索できます。他の言語での経験とはまったく異なる方法で、なじみのないデータセットを収集します。

于 2012-08-25T00:08:37.720 に答える
6

私はLispマクロに精通していませんが、マクロは一般にメタプログラミングに使用されます(入力を節約し、言語に制御構造を追加するため)。一方、型プロバイダーは、外部データソース用に強く型付けされたAPIを生成します。

共通しているコンパイル時の「拡張」以外は考えられません。

于 2012-08-24T20:39:37.580 に答える
6

F#タイププロバイダーは、コンパイル時コード生成の非常に特殊なケースです。つまり、コンパイル時コード生成によって特定の種類の問題を解決することを目的としています。これらを使用すると、コンパイル時に新しい型を生成できます。

LISPマクロは、メタプログラミングへのより一般的なアプローチであるため、多くのユースケースに対応します。マクロは基本的に入力をS式(コードまたはデータ)として受け取り、他のS式を出力します。

したがって、タイププロバイダーはマクロを使用して簡単に実装できますが、タイププロバイダーでは「マクロでできること」の全範囲をカバーすることはできません。

于 2012-08-26T09:53:18.963 に答える