F#でカレンダープログラミングをやってみました(その4・FINAL)

Myoga-SB-SDF-A2

Hello~! ミョウガです!

今回は、F#のカレンダープログラムの更なるショートコード化にチャレンジした時のお話です。

 

1. F#のカレンダープログラミングにおけるショートコード化カギはパイプライン演算子「|>」の活用にあり!?

F#でカレンダープログラミングをやってみました(その3)」にある「Calendar5.fs(GitHub内: CalendarOld2.fs)」を以下に示します。

 

このプログラムの5~7行目の部分をもっと短くしてみたいなと思い、パイプライン演算子「|>」を使ってコードを工夫してみました。

※このプログラムは https://gist.github.com/Myoga1012/e4c9e921ed1ae635185b でも公開されています。

このカレンダープログラムにて必要なものは、「1日の曜日」と「当月末日」の2つです。ということで、現在の日付を表す「DateTime.Now」からパイプライン演算子を使って、1日の曜日と当月末日を求めるようにすればよいのです。

  1. DateTime.Nowから現在の日付を取得します。
  2. DateTime型のオブジェクトから1日の曜日と当月末日を返すラムダ式の引数に1.のDateTime.Nowを指定します。関数の戻り値は1つですが、タプルを活用することで複数の値を返すことができます。
  3. 1日の曜日は、DateTime.NowからAddDaysメソッドを使って「1 – 現在日」だけ引いた値だけ日付を進めた(すなわち、「現在日 – 1」だけ日付を過去に戻した)時のDateTime型のオブジェクトを取得し、そこからDayOfWeekプロパティで求めます。
  4. 当月末日は、DateTime.NowからDateTime.DaysInMonthメソッドを使って求めます。

そこで求めた1日の曜日と当月末日を使って、カレンダー用のリスト(シーケンス)を生成し、各要素を出力するとカレンダーが表示されます。

さらに「F#でカレンダープログラミングをやってみました(その1)」の「Calendar2.fs(GitHub内: Calendar.fs)」にある日付出力において、「for in文のinの後に指定するシーケンスの生成式で、範囲を[( – 1日の曜日 + 1 )..末日]にし、要素(ここではcurDay)が負の値や0の時、半角スペース3文字を出力する」というテクニックを生かし、カレンダー用リストの生成時にラムダ式を使って、各要素を半角スペース3文字(1日の曜日合わせのパディング)または日付の文字列(土曜日では改行記号も追加)で初期化しています。

CalendarFSI4

 

「Calendar6.fs(GitHub内: Calendar.fs)」と同じ動作をするプログラムを以下に示します。

このコードのサイズは265バイトです(可読性はお察しください・・・)。

 

2. F#のスクリプトでエントリーポイントを取っ払いました

実はというとF#には ソースファイル(拡張子「.fs」)の他、スクリプト(拡張子「.fsx」)があります。Visual Studioのドキュメントによると、「少量のコードを実行する」目的で使用するみたいです。

早速、「Calendar6.fs(GitHub内: Calendar.fs)」をF#のスクリプト向けに改造したコードを以下に示します。

※このプログラムは https://gist.github.com/Myoga1012/e4c9e921ed1ae635185b でも公開されています。コンテストにはこのプログラムで応募しました。

 

スクリプトでは上から順に実行するため、エントリーポイント(「[<EntryPoint>]」と「main関数」)が不要になります。

これと同じ動作をするプログラムを以下に示します。

コードのサイズは244バイトと、さらに小さくなりましたっ!(≧▽≦)/

(くどいですが、可読性はお察しください・・・)

\すげぇ/

 

 

3. おわりに

F#のカレンダープログラミングの開発話(本編)は以上です。これをやる前はF#について少々かじった程度でしたが、これをきっかけにリストの使い方やパイプライン処理などF#ならではの機能を学ぶことができました(F#の機能自体は他にも色々ありますが)。

 

それともう1つ、昨年の12月28日にプログラミング生放送のブログにて、#カレンダープログラミング プチコンテストの選出コードが発表されました。

http://pronama.azurewebsites.net/2014/12/28/calendar-programming-contest-24-codes/

そこに「Calendar6.fsx(GitHub内: Calendar.fsx)」のコードが選ばれましたっ!(≧▽≦)/

(※まだ「仮」決定みたいです)

カレンダーが楽しみですっ!

 

ではでは、See youですよっ♪

 

この記事をシェアする
Chronoir.netのRSSフィードを購読する

About : ミョウガ(Myoga)

Hello~! 「ミョウガ」です。よろしくお願いします!(≧▽≦)/ 主にC#/XAML/C++などをメインにプログラミングやアプリの開発をしています。好きな物はカフェラテとハーブティ、趣味は写真撮影と艦これです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*