5.1. combinatorについて
- Conor Hoekstra. 2022. Combinatory Logic and Combinators in Array Languages. In Proceedings of the 8th ACM SIGPLAN International Workshop on Libraries, Languages and Compilers for Array Programming (ARRAY ’22), ACM, 2022. pdf
hxがぶっ飛んだので再び入力する気が戻って来るまでessenceだけ書いておく。
#define swap_int(x,y) { int tmp = x; x = y; y = tmp;}
mask ← (¯1=)𝕩
mask/𝕩
❓ ← {𝔽 _𝕣_ 𝔾 𝕩 : y ← 𝔽 𝕩 ⋄ y 𝔾 𝕩} # あるいは等価変換して {𝔽 _𝕣_ 𝔾 𝕩 : (𝔽 𝕩)𝔾 𝕩}
(¯1⊸=)❓/𝕩
APLのプログラムが簡潔なのは関数が1文字で表されるからだと勘違いする人がいてもおかしくない。 しかし実際にはグリフは40〜60個程度しかなくmonadic applicationとdiadic applicationの意味の違いを考えても実際に1文字で表されるデータ操作、アルゴリズムは100個程度しかないので、それではAPLの簡潔さは説明できない。
むしろ、
- point-free coding style(あるいはIverson記法)から来る、引数・返値の明示的記述の省略
- combinatorsの多用から来る、ローカル変数・制御構造の明示的記述の省略
が簡潔さの本質である。 💣言葉が汚くて申し訳ないが「同じ識別子が2回出現するなんてバカじゃねーの」である1。
1
APLの人がそう言ったわけでもBQNの人がそう言ったわけでもないのでご注意。さらにプログラムが長くなれば理解しやすいようにステップごとに中間結果をローカル変数に反映させて行くことはどの言語でも当然の書き方なのでそれもご注意。
References
Combinatorを使ったプログラムの簡潔さの布教ビデオを見るべし
ちょっと違うがこれもぜひ