Reasonとは
最近OCamlに触れることがよくあり、色々調べていると出てきたReason。公式ドキュメントによると、Reasonは新しい言語ではなく、OCamlで動く新しい構文とツールチェインだそうで、JavaScriptの負の遺産を取り除き、ES2030の機能を足し、JSとOCamlエコシステムの両方にアクセスできるもので、BuckleScriptによって、JavaScriptにコンパイルする、と書かれていました。ちょっと何言ってるのか分からない。しかし、OCamlを使っているので、強い型システム、安全性を持っているということは何となく分かります。
構文もOCamlによく似ているので、ひょっとしたら私にもできるのかもと思い、今回試してみることにしました。
インストール
さっそくインストールしていきます。最初、公式ドキュメントに書かれているとおりにやってみたのですが、どうもうまく行かないので以下の方法でやってみました。
$ mkdir reason_dev
$ cd reason_dev
$ npm init -y
$ npm install --save-dev bs-platform
$ touch bsconfig.json
bsconfig.json
の中身は以下
{
"name": "reason_dev",
"namespace": true,
"sources": ["src"]
}
そして
$ mkdir src
$ touch src/index.re
index.re
にHelloWorldプログラムを書いてみます。
let greet = (name) => {
switch (name) {
| Some(name) => "Hello, " ++ name ++ "!!"
| None => "Hello, world!!"
};
};
Js.log(greet(Some("Reason")));
Js.log(greet(None));
実行してみる
$ npx bsb -make-world
$ node lib/js/src/index.js
Hello, Reason!!
Hello, world!!
2つのコマンドはpackage.json
に以下のように書いておくと便利。
{
"name": "reason_dev",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"dev": "bsb -make-world && node lib/js/src/index.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"bs-platform": "^8.2.0"
}
}
こうすることで、以下のようにするだけで良いようになります。
$ npm run dev
Hello, Reason!!
Hello, world!!
OCamlと構文を比較してみて
Reasonでは関数の書き方がちょっと独特な気がします。
let 関数名 = (引数) => ....
しかし、ややこしいわけではないので、特に問題なし。
またパターンマッチングにswitch
を使うようで、前出のHelloWorldプログラムでも使ったような形になります。
ref
に関してもデリファレンスでOCamlでは!x
となりますが、Reasonではx^
となります。
そのほかでいうと、セミコロンの扱いの違いもあります。
まとめ
ReasonはOCamlの構文に近いぶん、学習しやすいかと思いましたが、微妙な違いが逆に私の頭をカオスにしてしまう恐れもありますが、とりあえずJavaScriptの学習がなかなかはかどらない私には良い刺激になりそうです。
追記(2020/10/02)
公式ドキュメントに書かれてあるセットアップ方法で、うまく行かなかったので上記のような方法をとっていましたが、以下のようにやるとうまくいきました。
$ npm install -g bs-platform
$ npx bsb -init my-new-project -theme basic-reason
$ cd my-new-project
$ npm link bs-platform
$ npm run build
$ node src/Demo.bs.js
Hello, BuckleScript and Reason!
npm link bs-platform
が必要だったようです。