SICPのSchemeとTAPLのOCamlを使うために

# Windows Subsystem for Linux

Harold Abelson，Gerald J. Sussman，およびJulie Sussmanによる共著「計算機プログラムの構造と解釈」（#sicp）とBenjamin C. Pierceによる著書「型システム入門」（#tapl）を読むには，本文のコードを試しながら勉強したいということから，それぞれ関数型プログラミング言語として知られているSchemeとOCamlを実行する環境をWindows 10で構築できるようにしてみた記録です。

これらの著書でプログラミングの基礎理論（というか，哲学まで含めて）を学ぶことができそうです♪

- [計算機プログラムの構造と解釈 第2版](https://www.shoeisha.co.jp/book/detail/9784798135984)
- [型システム入門 -プログラミング言語と型の理論=](https://www.ohmsha.co.jp/book/9784274069116/)

まずは，Windows Subsystem for Linuxの機能を有効にします。

［スタートボタン］を右クリックして，「アプリと機能」から画面右側の「プログラムと機能」を開きます。
（「プログラムと機能」のリンクが見えないときは，「アプリと機能」の画面を最大化してください）

|![ファイル_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208216/762894f5-939e-25e8-34fe-eba582e5a84c.png)|
|:-:|

「Windowsの機能の有効化または無効化」の設定で，「Windows Subsystem for Linux」をチェックして有効化してください。

|![ファイル_001 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208216/1524fe2f-681b-4e5c-59ba-1dc04edd5ca6.png)|
|:-:|

その後，Windowsの指示に従ってシステムを再起動したら，［スタート］から「Microsoft Store」を開き，右上の検索窓で「Ubuntu」と検索します。

|![ファイル_001 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208216/b56c16a8-5583-f45d-e103-9f1948272a33.png)|
|:-:|

その中から「Ubuntu」の最新版を選択して，そのままインストールしてください。

|![ファイル_001 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208216/1da53a65-674c-464b-602a-100aa2ab8a23.png)|
|:-:|

ここまでの手順は，以下のリンク先の情報が役に立ちます：

- [Windows Subsystem for Linuxをインストールしてみよう！](https://qiita.com/Aruneko/items/c79810b0b015bebf30bb)
- [シス管系女子BEGINS 特別編 まんがでわかるWSL](https://system-admin-girl.com/comic/begins/sp-wsl/)

## Scheme

ここからは，Ubuntuを起動してLinuxの操作で進めていきます。

次のコマンドを実行して，「計算機プログラムの構造と解釈」（#sicp）向けにSchemeをインストールします。
その際，入力を求められたタイミングで，Ubuntuの導入時に設定したパスワードを入力します。
（入力したパスワードの文字列は表示されません）

```cmd:Schemeのインストール
$ sudo apt install mit-scheme
```
![mit-scheme.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208216/976e5305-9b9c-a507-f052-2174a19d9b6d.png)

インストールが終了したら，コマンド入力画面に戻ります。
「scheme」とコマンドを入力すると，Schemeのインタプリタ環境を起動することができます。

```cmd:Schemeの起動
$ scheme
```

![scheme起動.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208216/0c4d41a1-9c0b-0e65-e6ae-7c5b95bab97c.png)

Scheme上のコマンドプロンプトから，Schemeの文法に沿ってコマンドを入力してください。
いろんなコードを試してみることができます。

![scheme_演算.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208216/a5083a66-2a23-b71e-0777-4071f9e95658.png)

**(exit)**と入力してschemeを終了します。

```cmd:Schemeの終了
]=> (exit)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208216/bf3d37e8-9cc2-ef66-5452-052424e881a0.png)

終了して良い場合は，最後に「y」と答えてください。

## OCaml

次は，「型システム入門」（#tapl）向けに，OCamlをインストールします。

```cmd:OCamlのインストール
$ sudo apt install ocaml
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208216/52febda9-5a9b-840e-a2ef-15c815d5d374.png)

```cmd:OCamlの起動
$ ocaml
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208216/46dc733f-c53a-5beb-9e5e-42add9d577e7.png)

OCaml上のコマンドプロンプトから，OCamlの文法に沿ってコマンドを入力してください。

**exit 0;;**と入力してOCamlを終了します。

```cmd:OCamlの終了
# exit 0;;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208216/8e065695-ba74-c40f-480c-503b4767d8c2.png)


「型システム入門」に掲載されているコードを試すには，Benjamin C. Pierceの[Webサイト](http://www.cis.upenn.edu/~bcpierce/tapl/)に従って必要なファイルをダウンロードしてコンパイルする必要があります。

例えば，arithの実装を試すには，以下のような手順となります。

まず，[著者のWebページ](http://www.cis.upenn.edu/~bcpierce/tapl/checkers)からarith.tar.gzをダウンロードします。

通常，ダウンロードされたファイルはWindowsのダウンロード（Downloads）フォルダに保存されますので，Ubuntuからアクセスできるホームディレクトリにコピーします。

```cmd:arithのコピー
$ cp /mnt/c/Users/KICS17/Downloads/arith.tar.gz ~
```

arith.tar.gzはgzipによって圧縮されたアーカイブ形式のファイルですので，tarコマンドでディレクトリ上に元のファイル群を展開します。

```cmd:arithの展開
$ tar -xzvf arith.tar.gz
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208216/a8ad04fd-903c-cf46-d7bf-c1c4aad2cae9.png)

なお，cdコマンドは，指定されたディレクトリ（ここでは，arith）に移動するものです。

もし，makeコマンドがインストールされていなければ，ここで追加します。

```cmd:arithの展開
$ sudo apt install make
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208216/50e87c0d-8321-3fb3-f81e-107dc5311d95.png)

makeコマンドで，必要なファイルのコンパイルやリンクをして，実行ファイルを生成します。

```cmd:makeコマンドによるコンパイル
$ make
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208216/58456a46-3fa4-0af0-a4d1-61a1fa0d3854.png)

最後に，test.fを実行します。

```cmd:test.fの実行
$ ./f test.f
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208216/62e6dd10-3148-2ba5-1c39-6c2324f6702f.png)

なお，test.fの内容は，以下のとおりです。

```ocaml:test.f
/* Examples for testing */

true;
if false then true else false; 

0; 
succ (pred 0);
iszero (pred (succ (succ 0))); 
```

これで，「計算機プログラムの構造と解釈」と「型システム入門」を読み進めていく準備が整いました！

- [Benjamin C. Pierce, Types and Programming Languages](http://www.cis.upenn.edu/~bcpierce/tapl/)
- [TAPL訳者「型システム入門 プログラミング言語と型の理論」によるサポートページ](http://tapl.proofcafe.org/)