2020/09/27

Reasonに入門してみた

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が必要だったようです。