Io言語をWSL上に環境構築した

# Io
「Io」はプロトタイプベースオブジェクト指向言語．コンパクトな処理系，アクターを使った特徴的な並行処理などが特徴らしい．
JavaScriptやLuaでのプロトタイプベースの理解が深まるということでちょっと手を出してみました．
日本語記事が少なく辛かったので環境構築とFizzBuzz実行まで一通りのメモを残しておきます．

**※2020/09/05 追記**
より詳細なセットアップ方法の解説記事を見つけたので、セットアップについては **[こちら](https://www.ninton.co.jp/archives/4356)** を参照されることを推奨します。本記事では[#バイナリからのインストール](#バイナリからのインストール)で扱います。

# 環境構築編
辛かったといってもLinux環境ならGitHubからクローンしてきてドキュメント通りにコマンドを実行するだけなのでわかっている人には簡単だと思います．
Windows上で環境構築ということで初めはCygwinで試していたが途中のユーティリティのインストールで挫折したためいっそWSL（Windows Subsystem for Linux）を使ってLinux環境でやってしまうことにしました．今後もLinux環境はあったほうが便利だろうし．[^1]
[^1]: そもそもWindows使ってるせいと言われればそれはそう

## WSL導入
当初Bash on Ubuntu on Windowsと呼ばれていたものの正式版．
WSLのインストールはMS Storeから簡単に行えます．~~やりかたは **[ここ](http://www.atmarkit.co.jp/ait/articles/1608/08/news039.html)** を参照．~~ ディストリビューションは「Ubuntu 18.04 LTS」を選択．

記事が会員以外見られなくなっていたため追記．**[こちら](https://qiita.com/pyon_kiti_jp/items/d27b1fe0aa443c369813)** に従ってLinux ディストリビューションをインストール・ユーザー登録した後，

```shell
$ sudo apt update
$ sudo apt upgrade
```

でインストールツールを最新にする．（`sudo`のコマンドは管理者認証を求められます．）
<font color="LightGray"> 最後の`apt update`を忘れていたのでいろいろ詰まった．記事はよく読みましょう（）． </font>


開発ツールのインストール．詳細は **[ここ](https://www.yokoweb.net/2018/05/04/ubuntu-18_04-gcc-makme-install/)** 参照．

gcc,makeなどよく使われるツールをまとめてインストール

```shell
$ sudo apt -y install build-essential
```

cmakeのインストール

```shell
$ sudo apt-get -y install cmake
```

以上．

## Io処理系のインストール
※2020/09/05 追記
こちらの方法だと`Range`,`Regex`など一部パッケージが正常に動作しなかったため下記の[バイナリからのインストール](#バイナリからのインストール)でインストールすることをおすすめします。

続いてIoの **[公式ドキュメント](https://github.com/IoLanguage/io#building-with-cygwin)** のLinux Build Instructionsに従い

```shell
$ git clone --recursive https://github.com/IoLanguage/io.git
$ cd io/
$ mkdir build
$ cd build/
$ cmake ..
$ make
$ sudo make install
```
を順次実行．

これで環境構築は完了．build直下の`$ io`でIoが起動します．

## バイナリからのインストール
本記事でも参考にしている『7つの言語 7つの世界』に関連して色々な環境へのIoのインストール方法をまとめた記事がありました。
[Io言語をインストールするには | Ninton](https://www.ninton.co.jp/archives/4356#toc8)
公式サイトでaptでのインストーラーが用意されているようです。

以下上記サイトより引用。zipをダウンロードし展開、その後aptでインストールします。パスも通るのでカレントディレクトリに関わらず`$ io`で起動できます。

```shell
$ wget http://iobin.suspended-chord.info/linux/iobin-linux-x64-deb-current.zip

$ unzip iobin-linux-x64-deb-current.zip 
Archive:  iobin-linux-x64-deb-current.zip
  inflating: IoLanguage-2013.11.04-Linux-x64.deb  
  inflating: license.txt             
  inflating: README.txt     

$ sudo apt install ./IoLanguage-2013.11.04-Linux-x64.deb
```

# Io言語実行編
### Hello World
引数なしの`io`コマンドでIoの対話環境が起動します．[^4]
Ioでは基本的に構文はすべて`hoge fuga`で`hoge`に`fuga`というメッセージを送信するという形になります．

[^4]: この対話環境，ヒストリーやカーソル移動が使えないなどちょっと機能不足感はある．実用の際はコマンドから実行するのが良いか

Hello worldプログラムは `"Hello, world!" println`となります．`"Hello, world!"`というオブジェクトに`println`というオブジェクトをメッセージとして送信し，それに対応するスロット(ここではこの文字列のプロトタイプであるSequenceのさらにプロトタイプのObjectのprintlnスロット)が呼び出される．プロトタイプについての解説は割愛．

```
Io XXXXXXXX
Io> "Hello, world!" println
Hello, world!
==> Hello, world!
Io> 
```

また，他言語でよくあるようにメソッドでの出力も可能で，`writeln("Hello, world!")`とも書けます．

### FizzBuzz
FizzBuzzはひとまずforとifがあれば書けますね．

for構文は
`for(<ループカウンタ>, <ループ初期値>, <ループ終了値>, <ループカウンタ増分(optional)>, <実行内容>)`
となります．繰り返しの構文は他にloopやwhile，また，コレクションに対する`foreach`操作もあります．

if構文は
`if(<条件>, <真の場合>, <偽の場合>)`
または
`if(<条件1>) then(<処理1>) elseif(<条件2>) then(<処理2>) ... else(<その他>)`
となる．前者は真/偽の場合の値を返すが後者はnilを返すっぽいので注意．3項演算子かif文かみたいな．
また`elseif`の前に改行を入れたりするとif文の連鎖ではなくfor文に送る式の並列になってしまうようなので改行位置に注意する必要がある．

```io:fizzbuzz.io
fizzbuzz := method(n,
    for(i, 1, n,
	    if(i % 3 == 0 and i % 5 == 0) then(
	    	"FizzBuzz" println
	    ) elseif(i % 5 == 0) then(
	    	"Buzz" println
	    ) elseif(i % 3 == 0) then(
	    	"Fizz" println
	    ) else(
	    	i println
	    )
    )
)
fizzbuzz(100)
```
[^3]
[^3]: ~~ところで当然ながらQiitaにIoのシンタックスハイライトはない．これはJavaScriptのハイライトを使っているがelseifの色とかいろいろと微妙．~~普通にあった．ごめんなさい
`fizzbuzz := ...`の`:=`の前にスペースを入れないと`fizzbuzz:`という名前になってしまうので注意．文字列と`println`の間のスペースは省略可．
ファイルから実行することもできる．コマンドはそのまま`$ io <ファイル名>`．

```
$ io fizzbuzz.io
1
2
Fizz
...
98
Fizz
Buzz
$
```


**[Rosetta Code](http://www.rosettacode.org/wiki/FizzBuzz#Io)** にif式のみを使うパターンやlistを使うパターンもあるので参照してください．

# その他
文法ほか，Ioについて詳しいことは
『7つの言語 7つの世界』(Bruce A. Tale, まつもとゆきひろ監訳, 田和勝訳 オーム社)
や
まつもとひろゆき氏の記事 **[Rubyist のための他言語探訪 【第 3 回】 Io](https://magazine.rubyist.net/articles/0010/0010-Legwork.html)**
を参照すると良いと思います．
処理系がコンパクトというだけあって基本的な文法はとてもシンプル．
もうちょっと理解が進んだらいつか要点をまとめた記事を書くかもしれないが上記で十分な気もします．

Qiitaにもほとんど記事がなかったし最近のレファレンスが全然見当たらず，オンラインジャッジやオンライン実行環境でも(私の知る限り)対応しているものはないし[^2]どこで使うんだと言う感じだが物珍しいものというのは逆にやってみたくなるものです．(私はそういう人間なので)
[^2]: Anarchy Golfでは使えるらしい
いままでクラスベースOOPしか使ったことがなかったためいい刺激になりそう．

それにしてもこの言語，大変ググラビリティが低くIoLanguageで検索すると「もしかして: Language」と言われたりページ内検索でもI/Oの処理が大量にかかったりととにかく分かりづらい．もうちょっとわかりやすい名前をつけてほしかったですね．