matarillo.com

The best days are ahead of us.

9.9 F# 1.0 -- メタプログラミング

2021-09-25 00:00:21

F# 1.0では、F# に「クォートメタプログラミング」が追加されました。 クォートはLISPの開始以来LISPの重要な機能であり続けていました。 しかし、強く型付けされた関数型言語やオブジェクト指向言語へ進出することはめったにありませんでした1

2005年に、C# チームは初期のLINQプロトタイプにおいて、式クォートの新しい用途を見つけました。 LINQプロトタイプは、インメモリークエリーとデータベースクエリーの両方を表現することができる、内包構文と実行時の式クォートをC# に追加しました。 内部的には、LINQは関数型プログラミングから大きな影響を受けた、クエリーのコンビネーターエンコーディングを使用していました。 LINQの主要な貢献者はErik Meijerでした。彼は関数的なアイディア全般の熱心な伝道者であり、適用においても革新的でした。 LINQは大成功を収め、今日でも広く使用されているC# の機能となりました。 また、私は以前IntelでForteFLを使用していましたが、これは強く型付けされた関数型言語で、式クォートを持っていました。 さらに、MathematicaやRのようなシステムは式クォートを許し、記号要素と計算要素を混在させるという興味深い用途にこの機能を利用していました。 2006年にLINQの初期バージョンが発表されたとき、私はF# にクォートを追加する実験をすることにしました。 当初の目的は、LINQで利用可能なクエリー機構と相互運用することでした。

実験の成果は、2006年1月26日に「F# はLINQに出会い、素晴らしいことが起こる(パートI)」というタイトルで、プロトタイプ形式でリリースされました[Syme 2006d]。 サンプルコード片は次のとおりです。

let q =
    db.Customers
    |> where <@ fun c -> c.City = "London" @>
    |> select <@ fun c -> c.ContactName @>

詳細の一部は後のリリースで変更されましたが、サンプルコード中の <@ ... @> は式クォートリテラルで、式ツリーのクォートを形成しています。 プログラム中のこれらの部分は実行時に再解釈され、SQLクエリーの一部として実行されました。 このメカニズムは、より広範な「異種実行」問題にも適用されました。それは、MSRのAcceleratorライブラリーを利用してGPU上でF# コードを実行するというものです。 この研究はまとめてML Workshopで発表されました[Syme 2006g]。 その後、F# 2.0では、F# クォート用のAPIの設計が大幅に修正され、簡素化されました。

2006年初頭、プラハのチャールズ大学のTomas Petricekは、F# のクォートを利用したJavaScriptコンパイラーとWebプログラミングシステムの開発に着手しました[Petricek 2008]。 2007年4月、彼はF# チームにインターンとして加わり、F# の利用例をJavaScriptとGPUコンパイルにまで広げる仕事に関わり、 2009年に再びインターンとして戻ってきて、F# 2.0に対しIDEツールを含む多くの貢献をしました。


インデックスへ戻る


  1. SML/NJには、HOLなどの定理証明システムで使われている文字列のクォート機能があり,クォートと逆クォートの両方をサポートしていましたが、今回紹介する機能とは大きく異なります。 ↩︎