図28●米Microsoft提供のサンプル・コード集から「editor.fsx」を開いて実行した
図28●米Microsoft提供のサンプル・コード集から「editor.fsx」を開いて実行した
[画像のクリックで拡大表示]
リスト14●editor.fsxのコード。コメントを削除し,字下げを調整してある
リスト14●editor.fsxのコード。コメントを削除し,字下げを調整してある
[画像のクリックで拡大表示]

 前回の記事を読んで実行してみれば,F#がけっこう手になじんできて,F#のもっとまともなプログラムの例を見たいという気になってきただろう。マイクロソフトのサイトにアクセスし,「Downloads」というタブをクリックすると「FSharpSamples.zip」というF#サンプルがたくさん入った書庫ファイルをダウンロードできる。

 拡張子「fsproj」のファイルはVisual F#のプロジェクト・ファイルなので,そのままダブルクリックすればVisual Studio 2010が起動して開いてくれる。拡張子「fsx」のファイルはVisual F#のスクリプト・ファイルなので,Visual Studio 2010の「ファイルを開く」で開いてから,前回の図26のときと同じようにコードをすべて選択し「Send To Interactive」を選べばよい。

 図28はUserInterface\WinFormsScriptingにある「editor.fsx」というファイルを開き,実行した様子である。コメント含めて97行のコードで,メニュー付きのテキスト・エディタができてしまうのだから大したものだ。

 コメントを削除し,インデントを半角スペース2文字にし,適度に改行とインデントを入れたのがリスト14である。(1)で.NETの参照設定をし,(2)で新しいフォームを作る。(3)でメニュー項目を生成して追加。(4)でリッチテキストボックスを生成してフォームに追加する。

 (5)ではオープンしているファイル名を保持するfilenameを宣言している。mutableというのは束縛とは違って,値を変更できるようにするための宣言だ。(6)のSetFilename関数は,mutable filenameに引数fの値を格納し,フォームのキャプション(タイトル)を「Editor - 」とファイル名にするものだ。(7)でファイル名を「scratch.txt」に,(8)でリッチテキストボックスに「type text here...」というテキストを挿入する。

 (9)はファイルをオープンして読み込む関数ReadFileだ。「開く」コモンダイアログを表示し,DiarogResult.OKという結果が返ってくれば,Some(ファイル名,テキスト・データ)という結果を返す。そうでなければNoneを返す。

 (10)はファイルを保存する関数SaveFileで,「名前を付けて保存」コモンダイアログを表示し,DialogResult.OKという結果が返ってくれば,Some(ファイル名)という結果を返す。そうでなければNoneを返す。

 (11)はファイルを読み込むコールバック関数だ。「let opLoadText _」というのは,opLoadText関数は引数を一つ持つが,名前を付けずに無視するという意味。アンダースコアは構文上「匿名」という程度の意味で使われる。opLoadTextとopSaveTextではパターン・マッチ構文を使っている。ReadFileの結果が「Some (file, text)」の形式(パターン)なら,SetFilename(file) して,リッチテキストボックスtextBに読み込んだテキストtextの内容を表示する。結果がNoneなら何もしない。

 (12)はファイルを保存するコールバック関数。(13)はこのプログラムの情報を表示するコールバック関数で,「|>ignore」はMessgeBox.Show の結果をopAboutの結果として返さずに,無視して捨てろ,という程度の意味だ。(14)は終了処理のコールバック関数である。(15)はメニュー項目とコールバック関数を結び付けるコード,(16)はコンパイル時にフォームを表示するコードである。

 F#はプログラミングが抱えている課題に対する,大きな解になる可能性がある。マイクロソフトがF#をどのように育てていくのか楽しみだ。