こんにちは。
今回は、プログラミング言語「Uiua」を紹介します。
こんなツイートを見た。
Uiuaで遊んでみた!
— ronwnor (@Pixelated_Donut) 2023年11月23日
array language系は初めてだからプログラムの組み方に戸惑ったけどなんとかできた!
これはキュゥべえを描くプログラムhttps://t.co/p0rtiGun1k pic.twitter.com/Hpf2NnLhPI
謎の文字の羅列。なぜこれで絵が描けるのか。
こんなん見せられたらやるしかありません。
というわけでやります。
目次
「Uiua」とは
Uiua (Uiua) はプログラミング言語のひとつで、今年出たばかりのできたてほやほや言語です。
発音は「ウィーワー (?)」という感じらしい。
公式サイトには「単純で、美しく、そして暗黙なコードを書くことに重きを置いた」や「可読性を残しつつもできるだけ短いコードを書ける」とありました。
ちょうど最近「Piet」を触ってみましたが、Uiua も同様にスタックベースで、後入れ後出しで値を取り扱います。
ただ、数字や文字列だけでなく、画像や音の出力も可能なようです。
○
はサイン関数、⧻
は配列の長さを返す関数というように特定の文字 (Glyph) に関数が組み込まれており、パッと見は難解プログラミング言語ともいえそうです。
組み込み関数は Documentation (https://www.uiua.org/docs) の「Functions」の章に羅列されています。
基本的には、上記サイトの「Tutorial」や「Other Docs」を読めば基礎的な力はつくと思われます。
インストールと実行環境
インストールしなくてもいい
初っ端から矛盾してますが、インストールしなくても公式サイトにエディタ (https://www.uiua.org/pad?src=0_4_1__) があるのでそちらを使うと楽です。
コードが URL に埋め込まれるのか、つくったプログラムを共有することもできるようです。
Uiua interpreter のインストール
基本的には公式サイト (https://www.uiua.org/docs/install) に記載の方法に従えばよいと思います。
しかし、私は Windows ユーザーなのですが、なぜか GitHub からダウンロードした exe ファイルを起動してもインストールされず、結局 Windows ユーザー以外の方法に従ってインストールしました。
(ダウンロードしてきた exe ファイルをダブルクリックすればいいんですよね・・・?)
ざっくり言うと、Rust をインストールして、コマンドプロンプトで cargo install uiua
を実行すれば完了です。
ただし私の環境では「Visual Studio C++ Build tools」なるものも足りなかったようで、これもダウンロードしました。
うまくいかなかったら、パソコンを再起動するといけるかもしれません。
VSCode での開発環境の構築
「Extensions」のタブで「uiua」と検索すると、VSCode で Uiua のシンタックスハイライトやフォーマッティングができる拡張機能が見つかります。
また、Uiua における関数は特殊文字もあるので、簡単に打ち込めるようにしたキーパッドが使える拡張機能もあります。
プログラムの実行方法
Python などと同じように、コードファイルのあるフォルダでコマンドプロンプトを起動し、
uiua run
や
uiua ファイル名.ua
と打ち込むことで実行結果が表示されます。
コーディング
コードは基本、右から左に実行されます。
例えば、
+ 2 ⇡ 5
⇡
は range 関数で、0 から n-1 までの数を入れた配列をつくります。
つまり、⇡ 5
は [0 1 2 3 4]
となります。
そして + 2
で各要素に 2 を足していきます。
結果、[2 3 4 5 6]
となります、
Uiua における組み込み関数を簡単に打ち込めるようになるキーパッドもあると書きましたが、関数の名前自体を書くことでも代用できます。
つまり、先程のコードは
add 1 range 5
と書いても問題ありません。
(実際は、実行時に勝手に Glyph に書き換えられる、という形になっています。)
一意に決められれば、関数名は多少省略してもよいようです。
ここからは、実際にいろいろつくってみます。
フィボナッチ数列
⍥(⊂/+↙2.)10[1 1] # 結果: [144 89 55 34 21 13 8 5 3 2 1 1]
初めに配列 [1 1]
をつくり、()
内の処理を ⍥()10
で 10回繰り返します。
()
内では、.
で配列の複製、↙2
で複製した配列の先頭2つを取り出す、/+
で取り出した2つの和を計算する、⊂
で元の配列に計算結果を入れる、という感じです。
素数リストの作成
▽¬∊:♭⊞×...+1↘1⇡20 # 結果: [2 3 5 7 11 13 17 19]
まず、+1↘1⇡20
で 2 から 20 までの自然数を入れた配列をつくり、...
で同じ配列を3つ増やします。
↘
は先頭から指定した個数だけ要素を配列から除きます。
⊞×
で2つの配列の各要素について積を計算し、2次元の配列をつくります。いわば合成数を集めた配列ですね。
(100マス計算みたいな感じ。)
♭
で2次元配列を1次元にします。扱いやすくしただけです。
(フラットだけに。)
:
でスタックの上2つを入れ替え、¬∊
で初めの配列と合成数を集めた配列を比較し、被っている要素は 0、被っていない要素は 1 に変えます。
つまり、初めの配列で合成数は 0、素数は 1 に置き換えられた配列ができあがります。
最後に ▽
で、初めの配列と 0 と 1 の配列を比較し、0 の部分は消し、1 の部分は残します。
これで晴れて合成数は除かれ、素数だけが残る、ということになります。
ちなみに、関数をつくることもでき、
f ← ▽¬∊:♭⊞×...+1↘1⇡ f20
で、先程と同じ意味になります。
ウルフラムコード
Uiua では画像もつくることができます。
画像に変換する関数があるわけではなく、30 × 30 以上の2次元配列がつくられると勝手に変換される、という感じのようです。
⇌[⍥(∊:⊚⋯90⍘⋯⇌◫3⊂0⇌⊂0.)⌊÷2⧻.]=⌊÷2:⇡.200
ここまでくると解説も大変です。ざっくりとだけ。
=⌊÷2:⇡.200
で最初の盤面をつくります。
⍥()⌊÷2⧻.
で ()
内の処理を、横幅を2で割った数 (⌊÷2⧻.
) 回だけ繰り返します。
()
内では、⊂0⇌⊂0.
で両端に 0 を追加 (境界条件)、⍘⋯⇌◫3
で3つずつ切り出して10進数に変換、∊:⊚⋯90
でルール90を適用、という流れです。
ウルフラムコードは過去にセル・オートマトンの回で触れていますが、そのときのルールをそのまま適用した感じなので、良ければそちらも読んでみてください。
セル・オートマトンに関しては ◫
の扱いが重要になってきそうです。
その他、マンデルブロ集合やライフゲームを実装している例もありました。
実は Uiua のロゴも Uiua でつくられているとかいないとか・・・。
まとめ
以上、Uiua を触ってみました。
パッと見は難解ですが、実際やってみると意外と読めるので楽しいです。
gif や音声もつくることができますが、それはまた機会があればということにしておきます。
最後まで読んでいただいてありがとうございました。また次回。