見出し画像

【日記を書く21日目】switch式って欲しくない?

れみです。今日で連続投稿3週間です。始めてから3週間経ったんですね。仙台の気温が20度とかになりました。3週間前はまだ3月で寒かったんですけどね。

昨日の記事

今日は、JavaScriptやTypeScriptを使っていてよく思うことです。switch式があったら便利だなと思うんですよね。すでにswitch文はあります。では文と式の何が違うのかというと、ざっくりした説明だと、式は評価した結果が値になります。演算子によって計算されるもの、って言い方もできるかな。

正しくは公式ドキュメントで。

さて、なぜswitch式が欲しいなんて思ったかというと、条件式を評価した結果とマッチする処理の結果を値として取り出したい場面があるからです。

例えば、こんな処理があったとします。

let color;
const fruit = 'apple';

switch (fruit) {
  case 'apple': { color = '#ff0000'; break; }
  case 'banana': { color = '#ffff00'; break; }
  case 'peach': { color = '#ffe5b4'; break; }
  default: { color = '#ffffff'; break; }
}

やりたいことは単純です。fruitの値に応じてcolorに色コードを表す文字列を格納する処理です。ただ、switchは文なので、switchの結果に応じて変数に値を入れようとすると、letで宣言された変数を使わないといけないです。

個人的には、letの変数は使いたくないです。かつてML系の関数型言語を使っていた名残りかもしれないですが、再代入可能な変数があるのがちょっと怖いです。エディタの力を借りたら探すのは何も大変ではないのですが、どこかで値が書き変わっているかもしれない可能性を考えたくないです。

というわけで、こんなふうに書きたいんですよ。

const fruit = 'apple';

// JavaScriptには存在しないコード
const color = switch (fruit) {
  case 'apple': { return '#ff0000'; }
  case 'banana': { return '#ffff00'; }
  case 'peach': { return '#ffe5b4'; }
  default: { return '#ffffff'; }
}

JavaScriptを触ったことのある方であれば、objectを使えば同じような処理を式として実現できることに気づくでしょう。

const fruit = 'apple';
const color = {
  'apple': '#ff0000', // ここら辺でconsole.logしたいとか
  'banana': '#ffff00', // ここだけ結果を計算するロジックが複雑とか
  'peach': '#ffe5b4',
}[fruit];

はい、できましたね。ただ、これでいい場合もあれば、良くない場合もあると思っています。それは、objectなので文を置けないことです。何か複雑な処理をさせようと思うと、関数で切り出す必要があるかと思います。

もちろん、そんなコードを書く必要が出てきたら、上の例でいうとgetColor: string -> stringのような関数を作って、その中でswitch文なり、ロジックを書けばいいです。

でも、わざわざ関数にするのか、と実装の時に思ったりするじゃないですか。検証のコードとか書いてると、わざわざちゃんと書くのも面倒だったりします。

もちろん、JavaScriptにswitch式がないとできないことなんてありません。switch文を持つ関数を書けば、それでやりたいことは満たされます。だから、自分が思うことは、ちょっとの手間が面倒に思うからです。そして、パターンマッチングのような機能を備えたプログラミング言語を触った経験があるからです。少しでも不満に感じることがあれば、いい方にある機能を使いたくなります。

もしかしたら、こう思ってるのは自分だけだろうと思われたかもしれませんが、実はJavaScriptにパターンマッチングを導入しようというproposalはすでに数年前から存在します。

それでも、まだステージ1ということは、まあそういうことなんですよね。

ちなみに、本当にswitch式なんてものがJavaScriptに導入するようなことがあれば、言語設計がなかなか大変なことは目に見えてます。caseの先にかけるのがブロックであるならば、ブロックの最後の文が、そのcaseの評価結果を渡す命令である必要が出てきます。これはやばいですね。ついでにJavaScriptにはPromiseなんて機能もあります。これもやばいですね。

もしかしたら将来的にパターンマッチングのような機能を持つJavaScriptのような言語ができるかもしれませんが、それはもうJavaScriptではないんだろうなとも思います。

では今日はここまで。

この記事が気に入ったらサポートをしてみませんか?