OCaml Set Up (With WSL and OPAM)

WSL に OCaml をインストールする。

# 環境

```
エディション	Windows 11 Education
バージョン	22H2
OS ビルド	22621.382
エクスペリエンス	Windows Feature Experience Pack 1000.22632.1000.0
```

# WSL

## ドキュメント

wsl のインストールに関する Microsoft の公式ドキュメントは下記にある。

[WSL のインストール | Microsoft Learn](https://learn.microsoft.com/ja-jp/windows/wsl/install)

ドキュメントの対象はバージョン 2004 からになっている。Windows Update を定期的に適用していれば、Windows のバージョンは 21H2 などになっているはずである。今回は先日公開された 22H2 を使うが、大きく違いはないと思う。

## インストール

- `cmd` で検索をしてコマンドプロンプトを開く。

![cmd.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329632/adc9372e-aaf1-7872-8260-3d3d9ba7d646.jpeg)

- Linux の環境として Ubuntu をインストールする。

```
wsl --install
```

- 実行後

```
C:\Users\admin>wsl --install
要求された操作には管理者特権が必要です。
インストール中: 仮想マシン プラットフォーム
仮想マシン プラットフォーム はインストールされました。
インストール中: Linux 用 Windows サブシステム
Linux 用 Windows サブシステム はインストールされました。
インストール中: Ubuntu
Ubuntu はインストールされました。
要求された操作は正常に終了しました。変更を有効にするには、システムを再起動する必要があります。
```

再起動をする。再起動後に自動で Ubuntu が立ち上がる。ユーザー作成とパスワード設定を行う。その後、コマンドプロンプトを開き、

- wsl に関するパッケージの更新

```
wsl --update
```

コマンド実行後に更新があれば Windows の再起動を行ったほうが良いかもしれない。

# Ubuntu

Ubuntu のインストールを行ったので、Ubuntu 内の設定を行う。

## apt

apt は Ubuntu にインストールされているパッケージ管理システムである。新しくソフトウェアをインストールしたい場合に用いる。

- パッケージ一覧の更新を行い、それを元にパッケージの更新を行う。

```
sudo apt update -y; sudo apt upgrade -y
```

# opam

opam は OCaml 用のパッケージマネージャーである。

- インストールを行う。

```
sudo apt install opam -y
```


## opam 設定

opam をインストールすると OCaml を使用することができるが、opam の設定を行うと OCaml のバージョンを変更したり、他のパッケージを管理することができる。

- opam のインストール

```
opam init
```

- `~/.profile` 設定

```
Do you want opam to modify ~/.profile? [N/y/f]
(default is 'no', use 'f' to choose a different file) y
```

`y` を選択した場合 `~/.profile` に設定を書き込んでログイン時に `opam` を有効にするようにする。各自で好きな選択を行うとよい。

- opam init hook

```
A hook can be added to opam's init scripts to ensure that the shell remains in sync with the opam environment when they
are loaded. Set that up? [y/N] n
```

`y` を選択した場合 opam の init スクリプトを実行するときに opam の環境を同期したままにできる。よく分からない。各自で好きな選択を行うとよい。

- 環境変数の更新

```
eval $(opam env)
```

opam で用いる環境変数の更新を行う。

## OCaml バージョン

- OCaml バージョンの確認

```
ocaml --version

opam switch
```

実行例

```
$ ocaml --version
The OCaml toplevel, version 4.08.1

$ opam switch
#  switch   compiler             description
→  default  ocaml-system.4.08.1  default
```

- OCaml バージョンの候補

```
opam switch list-available | grep base
```

実行例

```
$ opam switch list-available | grep base
(省略)
ocaml-base-compiler                    4.11.0                                 Official release 4.11.0
ocaml-base-compiler                    4.11.1                                 Official release 4.11.1
ocaml-base-compiler                    4.11.2                                 Official release 4.11.2
ocaml-base-compiler                    4.12.0~alpha1                          First alpha release of OCaml 4.12.0
ocaml-base-compiler                    4.12.0~alpha2                          Second alpha release of OCaml 4.12.0
ocaml-base-compiler                    4.12.0~alpha3                          Third alpha release of OCaml 4.12.0
ocaml-base-compiler                    4.12.0~beta1                           First beta release of OCaml 4.12.0
ocaml-base-compiler                    4.12.0~beta2                           Second beta release of OCaml 4.12.0
ocaml-base-compiler                    4.12.0~rc1                             First release candidate of OCaml 4.12.0
ocaml-base-compiler                    4.12.0                                 Official release 4.12.0
ocaml-base-compiler                    4.12.1                                 Official release 4.12.1
ocaml-base-compiler                    4.13.0~alpha1                          First alpha release of OCaml 4.13.0
ocaml-base-compiler                    4.13.0~alpha2                          Second alpha release of OCaml 4.13.0
ocaml-base-compiler                    4.13.0~beta1                           First beta release of OCaml 4.13.0
ocaml-base-compiler                    4.13.0~rc1                             First release candidate of OCaml 4.13.0
ocaml-base-compiler                    4.13.0~rc2                             Second release candidate of OCaml 4.13.0
ocaml-base-compiler                    4.13.0                                 Official release 4.13.0
ocaml-base-compiler                    4.13.1                                 Official release 4.13.1
ocaml-base-compiler                    4.14.0~alpha1                          First alpha release of OCaml 4.14.0
ocaml-base-compiler                    4.14.0~alpha2                          Second alpha release of OCaml 4.14.0
ocaml-base-compiler                    4.14.0~beta1                           First beta release of OCaml 4.14.0
ocaml-base-compiler                    4.14.0~rc1                             First release candidate of OCaml 4.14.0
ocaml-base-compiler                    4.14.0~rc2                             Second release candidate of OCaml 4.14.0
ocaml-base-compiler                    4.14.0                                 Official release 4.14.0
ocaml-base-compiler                    5.0.0~alpha0                           Zeroth alpha release of OCaml 5.0.0
ocaml-base-compiler                    5.0.0~alpha1                           First alpha release of OCaml 5.0.0
```

- OCaml インストール

```
opam switch create 4.14.0

eval $(opam env)
```

公式リリースで最新版である 4.14.0 をインストールする。インストール後に環境変数を更新する。

# utop

utop は OCaml の REPL である。カラフルで賢そうなのでインストールするとよさそうだか、私の使用経験がない。

- インストール

```
opam install core core_bench utop
```

[Real World OCaml](https://dev.realworldocaml.org/install.html) によると依存として `core` が必要らしい。

- 設定

```
#require "core.top";;
#require "ppx_jane";;
open Base;;
```

上記内容を `~/.ocamlinit` を作成して書き込む。`vim` などのエディタを使用すると良い。

```
vim ~/.ocamlinit
```

# エディタ

ここでは Visual Studio Code を扱う。

- lsp

```
opam install ocaml-lsp-server
eval $(opam env)
```

- 起動

```
code .
```

Windows に VS Code がインストールしてある場合は wsl 上で  `code` を実行すると WSL の実行環境で VS Code を開くことができる。VS Code の拡張機能である [Remote Development](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack) がインストールされていないといけないかもしれない。Windows 上の VS Code であらかじめインストールしておく。
自分の開いているディレクトリを開きたい場合は `.` で指定して開く。

- OCaml Platform

VS Code で OCaml のコーディングの支援を行う拡張機能をインストールする。事前に Windows にインストールしてあるとよい気がする。

[OCaml Platform - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=ocamllabs.ocaml-platform)