波括弧レスJavaScript理論

某所で初心者のJavaScriptコードを見ると本当に酷くてつらい気持ちになります。 波括弧がちゃんと閉じていないみたいなしょうもない上にやたら愚直に書かれていて一切の可読性がないコードを読むのは辛い。

波括弧レスJavaScript

絶対に解決はしないけど、波括弧なしでJavaScriptを書けば全てが解決しますねという気持ちになりました。

for(let i = 1; i <= 100; ++i) {
  if(i % 3 !== 0 && i % 5 !== 0) {
    console.log(i);
  } else if(i % 3 === 0 && i % 5 === 0) {
    console.log("FIZZBUZZ");
  } else if(i % 3 === 0) {
    console.log("FIZZ");
  } else {
    console.log("BUZZ");
  }
}

みたいなクソ雑なFIZZBUZZがまあありますよと、これを

Array(100).fill().map((_, i) => i + 1).forEach(i => i % 15 === 0 ? console.log("FIZZBUZZ") : (i % 3 === 0 ? console.log("FIZZ") : (i % 5 === 0 ? console.log("BUZZ") : console.log(i))))

こうするみたいな話ですね。

JavaScriptで波括弧使う例

if

三項演算子を使え

switch

三項演算子でがんばれ

while

再帰関数で頑張れ

for

Array(count).fill().map((_, i) => i).forEach(i => anyfunc)みたいな感じで一定回数のループはできるのでそれでコレクションを回すのは言わずもがな

Object

もしくはnew Objectしてそこにプロパティつっこみまくれ。ArrayにつっこみまくってJSON.stringifyが必要みたいなときとか純粋にObjectが必要になったらObject.entriesとか使ってがんばれ

関数

ひたすら辛い。

基本的には単一の値を返すArrow Functionを使う。 let hoge = (arg) => arg + 1; みたいな感じ

複数の処理をさせたいときはカンマ演算子で頑張る。こいつは() => hoge, fugaみたいなことをしたらfugaが帰ってくる。つまりカンマを挟んで次の値が返却値になる。だから let a = 1,2,3とかやると a3になる。 この手法はUglifyJSとかで変換後のJSとかを見るとよく使われている。割と便利。 しかし変数の宣言は返却値のみのArrow Functionないで出来なかったりするのでスコープについては諦めるしかない(かもしれない)。

代入文は普通に代入した値を返却するのでカンマ演算子の後側で使えるし、そのへんをうまくやったりする。

また、割と&&||演算子は便利。

前者は左辺式の評価値がtrueにキャストできる場合は右辺値を評価して返し、そうでない場合は左辺式の評価値を返す。

後者は左辺式がtrueキャストできればそのまま左辺式の評価値を、そうでなければ右辺式の評価値を返す。これもよくUglifyされたやつでみる。

割となんとかなると思う。この辺で頑張って処理したり、ローカル変数をひたすら先に用意しておいて代入文とカンマ演算子と論理演算子でがんばったりするだけでもいいし。

さらに言えばチューリングマシンで計算可能な関数は原始帰納的なので、初期関数三種の合成や原始帰納を有限回繰り返すだけで作れます。 初期関数は

{ \displaystyle
Z (x) = 0
}

 { \displaystyle
S (x) = x + 1
}

 { \displaystyle
U ^i _n (x_1, \cdots , x_n) = x_i
}

の3つで、JavaScriptで書くならそれぞれ

let Z = x => 0;
let S = x => x + 1;
let U = (i, ...args) => args[i];

として書ける。3つ目のやつに関しては割と自由だし、 {\displaystyle S }に関しても逆関数が簡単に書けるし楽。

合成と原始帰納については説明を割愛するけど、これらも普通に平易にJavaScriptで書くことが出来るわけで、まあつまりチューリングマシンで計算可能なレベルの関数であれば、Arrow Functionだけで頑張れるし、波括弧はいらない。

雑に思いついたまま書いただけなので今回はあまり詳しくは書かないけどどこかで詳しく書く機会があればやるかも