F# documents in Japanese

Hi, F#er's!!

Follow me on GitHub

F# Scriptで開発をはじめる

はじめに

F# で開発する上で作成したものを .exe などの実行形式にする方法と、テキストファイルのまま実行させる方法があります。
今回はテキストファイルのまま実行させる方法を紹介していきます。


もしみなさんが Python や バッチファイルを書いたことがあるようであれば想像しやすいと思います。
通常、プログラムはテキストファイルをコンピュータが理解できる形にする(= コンパイル)必要があります。
F# の場合 事前にコンパイルしておく こともできますし、実行時にコンパイルしながら実行させる こともできます。
F# Script は 実行時にコンパイルしながら実行する方法 です。


F# Script は大きなプログラムや速度が重視されるような場面での利用は難しいですが、業務の自動化や簡単なツールの作成などをするには適しています。
また、事前にコンパイルする必要がないためすぐに動作の確認などができる点が優れているため、F# を入門するさいに利用するのも良いでしょう。


F# Script を使ってみる

開発の準備をする

プログラムは プロジェクト と言う管理単位で開発していくことが多いです。
今回はどこか適当な場所に hello-world というディレクトリを作成して、そこをプロジェクトの保存場所とします。
サンプルでは C:/project/hello-world にディレクトリを作成しています。


ディレクトリを作成したら、ここで VSCode を起動します。
エクスプローラで右クリックをすると VSCode で開くためのオプションがあるので、それを選択すれば VSCode が起動します。


もしくターミナルで以下のように実行することで起動させることも可能です。

code "C:/project/hello-world"  



VSCode が起動したら main.fsx という名前のファイルを追加します。
ここで重要なのは .fsx という拡張子です。F# Script では .fsx を利用しているので間違わないようにしましょう。


これでひとまず開発するための事前準備が完了しました。
あとはこの main.fsx にコードを記述していくだけです!



Hello, World!!

まずはどんなプログラミング言語を利用していても必ず一度は行う Hello, World!! の出力儀式を行ってみましょう。
main.fsx に以下のコードを記述します。

printfn "Hello, World!!"  

記述している途中で以下のように入力の候補が表示されたかと思います。
これは 開発環境の構築 で紹介した ionide の機能によるものです。このように VSCode などの高機能なテキストエディタはメモ帳などとは異なり開発を補助する強力な機能を提供してくれます。


コードを記述し終えたら右上にある再生ボタンをクリックしてみましょう。
そうすると今のコードが実行されて、ターミナルに Hello, World!! が出力されます。



もしくはターミナルから直接実行させることもできます。
その場合はプロジェクトのディレクトリに cd コマンドで移動してから以下のコマンドを実行します。

cd C:/project/hello-world  
dotnet fsi main.fsx  



#load

少し複雑なプログラムを作成しようとすると複数のファイルにコードを分割したくなってきます。
これは似たような機能ごとにファイルをまとめておくことで保守しやすくするために重要なことです。


そこで問題になってくるのは分割したファイルに書いてあるコードをどうやって呼び出すのか?ということです。
その際に利用するのが #load です。


今回は tool.fsx と言うファイルを作成してみて、それを main.fsx から利用してみましょう。


tool.fsx には add という簡単な関数を1つだけ用意しておきます。


この addmain.fsx で利用してみます。
まずは main.fsx の先頭で #load を利用して tool.fsx を指定します。
今回は main.fsxtool.fsx を同じディレクトリ階層に存在しているので、

#load "tool.fsx"

で良いのですが、もし仮に tool.fsxmodules ディレクトリ内にあった場合は以下のように指定する必要があります。

#load "./modules/tool.fsx"

そして忘れてはいけないのが open の行です。
今回は tool.fsx というファイル名なので、その先頭を大文字にした名前で open してあげます。
そうすることで add を利用することができるようになります。
もしも open をしない場合は Tool.add とすることで利用することもできます。


tool.fsx を利用する準備ができたので、実際に add を利用してみます。
main.fsx を以下のようにしてみましょう。

#load "tool.fsx"
open Tool

let sum = add 10 20  
printfn $"add 10 20 = {sum}"  


これを実行すると以下のようにターミナルに結果が出力されると思います。


このように #load を利用することで分割したファイルの機能を呼び出すことができるようになります。
もし1ファイルが大きくなってきてしまったらファイルを分割して #load で呼び出すことを検討してみましょう。



**#r**

F# は nuget.org などで公開されている便利な機能をまとめたライブラリを利用することができます。
それらを利用したい場合に #r を利用します。
今回は最速の json シリアライザとして有名な Utf8Json をサンプルに利用してみたいと思います。


nuget パッケージを利用する場合には #r “nuget: パッケージ名” という書式で指定してあげます。
Utf8Json を利用する場合には以下のように指定してあげます。

#r "nuget: Utf8Json"

これで Utf8Json を利用する準備ができました。
記述してから少しすると読み込みが完了すると入力補助も有効化されます。


それでは実際に以下のようなコードで nuget.org から取得した Utf8Json を利用してみましょう。

#r "nuget: Utf8Json"
open Utf8Json

type Record = {
    Name: string
    Age: int
}

let json = """
{
    "Name" : "midoliy",
    "Age" : 31 
}
"""

let value = JsonSerializer.Deserialize<Record> json
printfn $"{value}"



このように nuget.org などで公開されている膨大な数のライブラリを F# から簡単に利用できることが確認できました。
Excel の操作をするためのライブラリやブラウザを操作するためのライブラリなど、多種多様なライブラリがあるので自分の目的にあったものを探して使ってみましょう。



おわりに

このように F# Script を利用することで簡単にプログラムを作成できることがわかりました。
もし何か業務で自動化したいものがある方は F# Script で作ってみてはいかがでしょうか?