プログラミングの備忘録

プログラムをつくる過程を残すもの

プログラミング言語「Uiua」を触ってみる

こんにちは。
今回は、プログラミング言語「Uiua」を紹介します。


こんなツイートを見た。


謎の文字の羅列。なぜこれで絵が描けるのか。
こんなん見せられたらやるしかありません。

というわけでやります。


目次


「Uiua」とは

Uiua (Uiua) はプログラミング言語のひとつで、今年出たばかりのできたてほやほや言語です。
発音は「ウィーワー (?)」という感じらしい。

公式サイトには「単純で、美しく、そして暗黙なコードを書くことに重きを置いた」や「可読性を残しつつもできるだけ短いコードを書ける」とありました。


ちょうど最近「Piet」を触ってみましたが、Uiua も同様にスタックベースで、後入れ後出しで値を取り扱います。

taq.hatenadiary.jp

ただ、数字や文字列だけでなく、画像や音の出力も可能なようです。


はサイン関数、 は配列の長さを返す関数というように特定の文字 (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を適用、という流れです。

ウルフラムコードは過去にセル・オートマトンの回で触れていますが、そのときのルールをそのまま適用した感じなので、良ければそちらも読んでみてください。

taq.hatenadiary.jp


セル・オートマトンに関しては の扱いが重要になってきそうです。


その他、マンデルブロ集合やライフゲームを実装している例もありました。
実は Uiua のロゴも Uiua でつくられているとかいないとか・・・。


まとめ

以上、Uiua を触ってみました。

パッと見は難解ですが、実際やってみると意外と読めるので楽しいです。

gif や音声もつくることができますが、それはまた機会があればということにしておきます。


最後まで読んでいただいてありがとうございました。また次回。