はじめに
Mokkosuは私が開発しているオレオレ関数型プログラミング言語です。Mokkosuのコンパイラは.NET Framework上で動作し、.NET Framework上で動作するexeファイルを出力します。文法や機能はHaskell、F#、OCamlなどの影響を強く受けており、これらの言語の経験者であれば難なく使い始めることができます。Mokkosuは関数型言語を使って、ゲームやインタラクティブアートといったプログラムを手軽に開発できる環境を構築することを目的として開発されました。詳細は以下の公式サイトおよびブログ記事を参照してください。
この記事の目的は普通のプログラマを対象として、Mokkosuがどのようなプログラミング言語であるのかを簡単に紹介することです。Mokkosuに興味をもっていただき、願わくば実際にダウンロードして使ってもらえれば幸いです。
環境構築
Mokkosuの環境構築は簡単です。リリースページから専用のインストーラをダウンロードしてきてダブルクリックして画面の指示に従って「次へ」をクリックしていくだけで環境構築が完了します。
インストールが完了すると、ディスクトップに簡易IDEであるMokkosuPadのアイコンが生成されます。
アイコンをダブルクリックすると以下の画面が表示されます。
Hello, World.
立ち上げたMokkosuPadのソースファイルペインにプログラムを入力して保存して、緑色の三角ボタンをクリックするとプログラムがコンパイル&実行されます。ここでは以下のプログラムを入力してみます。
let message = "Hello, World.";
msgbox message; # メッセージボックスの表示
println message; # 出力ペインへの表示
実行すると画面に以下のメッセージボックスが表示され、
出力ウインドウに以下のように表示されます。
=============================================
__ __ _ _
| \/ | ___ | | __| | __ ___ ___ _ _
| |\/| | / _ \ | |/ /| |/ // _ \ / __|| | | |
| | | || (_) || < | <| (_) |\__ \| |_| |
|_| |_| \___/ |_|\_\|_|\_\\___/ |___/ \__,_|
=============== Version 1.0.6 ===============
message : String
Hello, World.
message : String
は変数message
が文字列型であることを示しています。
関数の定義
ここでは階乗を計算する関数をいろいろなスタイルで記述していきます。
Mokkosuは関数型言語なので、以下のように階乗の数学的な定義をそのままプログラムに落とし込むことができます。
fun fact n =
if n == 0 -> 1
else n * fact (n - 1);
以下のようにパターンマッチを利用することでより数学的な定義に近づけることができます。
fun fact n =
match n {
0 -> 1;
n -> n * fact (n - 1);
};
このプログラムはより簡潔に以下のように記述できます。
fun fact = {
0 -> 1;
n -> n * fact (n - 1);
}
もっと短く書きたければ以下のようにも書けます。
fun fact n = foldl (*) 1 <| 1 .. n;
<|
は関数適用演算子です。
Mokkosuのコンパイラは末尾再帰最適化を実装しているので、スタックの消費が気になる方は、末尾再帰で記述することもできます。
fun fact n =
fun loop acc = {
0 -> acc;
n -> loop (n * acc) (n - 1);
}
in loop 1 n;
破壊的代入を用いた手続的な記述も可能です。
fun fact n =
let r = ref 1 in
do ignore (
for x <- 1 .. n
in r := !r * x
) in !r;
for .. in
はリスト内包表記の構文です。
ブロック構文
Mokkosuの{
と}
で囲まれたパターンマッチを行う構文はブロック構文と呼ばれています。F#やOCamlのfunction
キーワードと機能は同じですが、ブロック構文の方が短いので手軽に使うことができます。
以下のプログラムは、整数リストの1
を2
に、2
を1
に置換する例です。
let list = map { 1 -> 2; 2 -> 1 } [1, 2, 2, 1, 1];
# => [2, 1, 1, 2, 2]
さらにブロック構文はF#やOCamlでは実現不可能な以下のような記述が可能です。
fun f = {
0 -> 0;
let x = 123;
1 -> x;
2 -> x * 2;
do println "DEBUG: 0,1,2以外";
n -> n;
};
なんとパターンマッチの途中にlet
による変数束縛やdo
による式の実行、さらにはfun
による(再帰)関数の定義を間に挟むことができます。この構文を使うことで、長いパターンマッチで、必要な局所変数を実際に使う場所の近くで定義することが可能になります。
グラフィックプログラミング
Mokkosuでは描画を行うプログラムを簡単に記述できます。最初は単にウインドウを表示する例です。
include "Graphics.mok";
scene "main" { _ -> () }; # シーンの定義
show_window "main"; # シーンの開始
実行すると以下のようなウインドウが表示されます。
描画をするには、以下のように記述します。
include "Graphics.mok";
scene "main" {
~Draw(gr) -> do
fill_rectangle gr blue_brush 50 50 50 50;
fill_ellipse gr red_brush 70 70 50 50;
end;
_ -> ();
};
show_window "main";
実行すると以下のように表示されます。
マウス座標に緑色の円を表示するように拡張します。同時にタイトルバーに現在の座標を表示するようにします。
include "Graphics.mok";
let mx = ref 0;
let my = ref 0;
scene "main" {
# 描画処理
~Draw(gr) -> do
fill_rectangle gr blue_brush 50 50 50 50;
fill_ellipse gr red_brush 70 70 50 50;
fill_ellipse gr green_brush !mx !my 50 50;
end;
# マウス移動処理
~MouseMove(x, y) -> do
mx := x;
my := y;
set_title <| to_string x ^ " - " ^ to_string y;
redraw ();
end;
# その他
_ -> ();
};
show_window "main";
このようにMokkosuではグラフィカルなプログラミングを簡単に行うことができます。
おわりに
Mokkosuでのプログラミングの雰囲気はお分かりいただけたでしょうか。Mokkosuはまだまだユーザがいないので、今始めるとすぐに言語のエキスパートになることができます。興味のある方はぜひ使っていただけるとありがたいです。
Mokkosuは今後も機能拡張や改善を行っていく予定です。とりあえず実現したいと思っていることは以下の2点です。
- 型クラスの導入
- MokkosuによるMokkosuコンパイラの実装
プログラミング言語Mokkosuをよろしくお願いします。