やしログ

tc39_study に参加しました

created: 2021/09/18
tc39 の proposal を眺める、スピード感のある LT 会でした。

tc39_study という勉強会に参加してきました。

twitter で流れてきて、デモを見たところ面白そうだったため参加してみることにしました。参加登録時のアンケートで好きな proposal を聞かれ、ひねり出した挙げ句 Temporal と書きました。基調講演が全然分からなかったので時間があればアーカイブをもう一度見たいです。

気になった proposal まとめ

Pattern Matching (stage1)

発表でも触れられてましたが redux の reducer と相性良さそうです。(と思ったら example に載ってました...w)

switch 文に関する問題提起がなされていて、スコープが不明瞭だったり、各 case で break を書かないといけなかったり、 === による比較しかなかったり、というのが挙げられています。proposal 内にもありますが、 Rust のパターンマッチ(match)を輸入したものっぽく見えます。

do expressions (stage1)

(中に文を書ける) do ブロックから値を返すことができるというもの。jsx 内でよく書く三項演算子利用部分を置き換えるかたちで使うと良さそうに思いました。

error cause(stage3)

error の連鎖が起こった場合に、Error コンストラクタに cause オプションを付与することでその原因となるエラーを表現できるようにするもの。めっちゃ欲しいほどではないがあっても良さそうに思いました。既存の構文への影響も少なさそうです。

Pipeline Operator (stage1)

左辺の評価値を右辺の関数に適用できるというもの。他の言語にある |> 演算子のこと。構文が 2 種類提案されていて、いずれも他の言語からの輸入構文のようです。LT のスライドにある通り、部分適用と組み合わせるとより便利そうです。

なお、部分適用に関しては 別 proposal があるようです。

Temporal (stage3)

js の Date には様々な課題があるため、それらを解決した新しい日時表現方法を示すもの。UTC オフセット、タイムゾーンのフルサポート、イミュータブルなどが特徴として挙げられます。

Date に対する課題感と、 Date のままで対応する例を示した 記事 がわかりやすかったです。

Array Equality (stage1)

配列自体ではなく配列の要素の値が等しいかを返す .equals() のこと。Java みがある(個人談)。 あっても良さそうですが、ネストされた配列やオブジェクトを含む場合のパフォーマンスが気になります。そして仮にこの仕様が入った場合、じゃあ Object や Map や Set にも欲しくない?と膨れ上がっていきそうな気も。。。

Array deduplication (stage1)

Array.uniqueBy() です。 [...new Set(array)] と書くのだるいので個人的には嬉しいです。引数に重複要素の key を指定したり、関数を指定すると関数の返り値に基づいて重複排除したりできるようです。

Relative indexing method (stage3)

Array.at() です。引数に負の数を指定すると、末尾から N 番目の要素を返します。あると多分便利...たぶん。

New Set methods(stage2)

Setintersectiondifference などの便利メソッドを追加するというもの。あると何かと便利かもしれません。

uuid(stage1)

標準ライブラリとして uuid を提供する、というもの。proposal 内では、車輪の再発明による危険性などが説明されていて、暗号論的疑似乱数生成器(CSPRNG) を強制できるというモチベーションがあるらしいです。ライブラリがあるため困っていない人が多いんじゃないかと思いつつ、標準であって良いんじゃないのという気はします。

その他気になった proposal

LT では、発表者が気になる proposal を持ち寄って話す形式だったため、全ての proposal が網羅されているわけではありません。そこで、 LT には出なかった proposal も軽く眺めてみました。個人的に気になったものを挙げてみます。

Declarations in Conditionals(stage1)

let 式ですね。ほんのちょっとした用途でいちいち const を宣言しなければならないときに、「if 内で宣言できれば...」と思うことがそこそこあるので、個人的には欲しいです。

Array Grouping(stage1)

lodash にある Array.groupBy() ですね。 uniqueBy もですが、車輪の再発明を防げたり、ライブラリが不要になることによってバンドルサイズを削減できたりなど細かいメリットがたくさんあるため、よく使いそうな操作は標準でできるようになってくれると嬉しいですね。

所感

キャッチアップとして良い機会になりました。ECMAScript は「既存の Web を壊さないこと」を大前提として置いているため、基本的に機能の「追加」のみがなされます。そのため、開発者にとって痒いところに手が届くような仕様が充実してくると嬉しいなと思います。一方で、一度入った仕様は変更できないとも言えるため、おかしい(と思われる)仕様に関しては proposal の段階で開発者たちがしっかり声をあげていく必要があります。(というのが難しいのですが...。)

個人的に特に欲しいと思うのは Pattern Matching、Pipeline Operator でしょうか。Temporal は現在 stage3 ですが、力入ってそうなのでまもなく入るのでは。知らんけど。

ちょっと別話になりますが、「Web の仕様を ECMAScript が半ば握っている」という事情から、ECMAScript の仕様は膨張していく一方です。「ブラウザで動く言語が js のみである」という状況が変われば歯止めがかかるのではという気がしますが、あまり現実的ではないんでしょうか...。

ECMAScript が、「(多くの開発者が思う)正しい方向」に進化してくれることを願うばかりです。