LoginSignup
3
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2018-11-18

Io

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

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

環境構築編

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

WLS導入

当初Bash on Ubuntu on Windowsと呼ばれていたものの正式版.
WSLのインストールはMS Storeから簡単に行えます.やりかたはここを参照.ディストリビューションは「Ubuntu 18.04 LTS」を選択.
記事が会員以外見られなくなっていたため追記.こちらに従ってLinux ディストリビューションをインストール・ユーザー登録した後,

$ sudo apt update
$ sudo apt upgrade

でインストールツールを最新にする.(sudoのコマンドは管理者認証を求められます.)
最後のapt updateを忘れていたのでいろいろ詰まった.記事はよく読みましょう().

開発ツールのインストール.詳細は ここ 参照.

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

$ sudo apt -y install build-essential

cmakeのインストール

$ sudo apt-get -y install cmake

以上.

Io処理系のインストール

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

続いてIoの公式ドキュメントのLinux Build Instructionsに従い

$ 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
公式サイトでaptでのインストーラーが用意されているようです。

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

$ 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の対話環境が起動します.2
Ioでは基本的に構文はすべてhoge fugahogefugaというメッセージを送信するという形になります.

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文に送る式の並列になってしまうようなので改行位置に注意する必要がある.

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
fizzbuzz := ...:=の前にスペースを入れないとfizzbuzz:という名前になってしまうので注意.文字列とprintlnの間のスペースは省略可.
ファイルから実行することもできる.コマンドはそのまま$ io <ファイル名>

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

Rosetta Codeにif式のみを使うパターンやlistを使うパターンもあるので参照してください.

その他

文法ほか,Ioについて詳しいことは
『7つの言語 7つの世界』(Bruce A. Tale, まつもとゆきひろ監訳, 田和勝訳 オーム社)

まつもとひろゆき氏の記事 Rubyist のための他言語探訪 【第 3 回】 Io
を参照すると良いと思います.
処理系がコンパクトというだけあって基本的な文法はとてもシンプル.
もうちょっと理解が進んだらいつか要点をまとめた記事を書くかもしれないが上記で十分な気もします.

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

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


  1. そもそもWindows使ってるせいと言われればそれはそう 

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

  3. ところで当然ながらQiitaにIoのシンタックスハイライトはない.これはJavaScriptのハイライトを使っているがelseifの色とかいろいろと微妙.普通にあった.ごめんなさい 

  4. Anarchy Golfでは使えるらしい 

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1