Io
「Io」はプロトタイプベースオブジェクト指向言語.コンパクトな処理系,アクターを使った特徴的な並行処理などが特徴らしい.
JavaScriptやLuaでのプロトタイプベースの理解が深まるということでちょっと手を出してみました.
日本語記事が少なく辛かったので環境構築とFizzBuzz実行まで一通りのメモを残しておきます.
※2020/09/05 追記
より詳細なセットアップ方法の解説記事を見つけたので、セットアップについては こちら を参照されることを推奨します。本記事では#バイナリからのインストールで扱います。
環境構築編
辛かったといってもLinux環境ならGitHubからクローンしてきてドキュメント通りにコマンドを実行するだけなのでわかっている人には簡単だと思います.
Windows上で環境構築ということで初めはCygwinで試していたが途中のユーティリティのインストールで挫折したためいっそWSL(Windows Subsystem for Linux)を使ってLinux環境でやってしまうことにしました.今後もLinux環境はあったほうが便利だろうし.1
WSL導入
当初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 fuga
でhoge
にfuga
というメッセージを送信するという形になります.
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 := 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)
$ io fizzbuzz.io
1
2
Fizz
...
98
Fizz
Buzz
$
Rosetta Code にif式のみを使うパターンやlistを使うパターンもあるので参照してください.
その他
文法ほか,Ioについて詳しいことは
『7つの言語 7つの世界』(Bruce A. Tale, まつもとゆきひろ監訳, 田和勝訳 オーム社)
や
まつもとひろゆき氏の記事 Rubyist のための他言語探訪 【第 3 回】 Io
を参照すると良いと思います.
処理系がコンパクトというだけあって基本的な文法はとてもシンプル.
もうちょっと理解が進んだらいつか要点をまとめた記事を書くかもしれないが上記で十分な気もします.
Qiitaにもほとんど記事がなかったし最近のレファレンスが全然見当たらず,オンラインジャッジやオンライン実行環境でも(私の知る限り)対応しているものはないし4どこで使うんだと言う感じだが物珍しいものというのは逆にやってみたくなるものです.(私はそういう人間なので)
それにしてもこの言語,大変ググラビリティが低くIoLanguageで検索すると「もしかして: Language」と言われたりページ内検索でもI/Oの処理が大量にかかったりととにかく分かりづらい.もうちょっとわかりやすい名前をつけてほしかったですね.
-
そもそもWindows使ってるせいと言われればそれはそう ↩
-
この対話環境,ヒストリーやカーソル移動が使えないなどちょっと機能不足感はある.実用の際はコマンドから実行するのが良いか ↩
-
~~ところで当然ながらQiitaにIoのシンタックスハイライトはない.これはJavaScriptのハイライトを使っているがelseifの色とかいろいろと微妙.~~普通にあった.ごめんなさい
fizzbuzz := ...
の:=
の前にスペースを入れないとfizzbuzz:
という名前になってしまうので注意.文字列とprintln
の間のスペースは省略可.
ファイルから実行することもできる.コマンドはそのまま$ io <ファイル名>
. ↩ -
Anarchy Golfでは使えるらしい
いままでクラスベースOOPしか使ったことがなかったためいい刺激になりそう. ↩