2023-07 の TC39 meeting
まとめ
決まったこと
Web compatibility issues / Needs Consensus PRs
ecma402#709 Read date-time options only once when creating DateTimeFormat objects | Ujjwal Sharma Intl.DateTimeFormat のオプションが複数回読まれてしまう問題の Normative Change。承認された。
ecma402#768 Reorder NF resolved option "roundingPriority" | Ujjwal Sharma Intl.NumberFormat で roundingPriority オプションを読み込むのを早めて優先度を上げる Normative Change。承認された。
ecma402#783 Added support for sentence break suppressions to Intl.Segmenter | Ujjwal Sharma Unicode Extension Keyword として ss (sentence break suppressions) が定義されている。Intl.Segmenter にそのサポートを入れる Normative Change。承認された。
ecma402#786 Raised minimum/maximum fractional digits from 20 to 100 | Ujjwal Sharma Intl.NumberFormat が作る文字列は20文字までとなっているが、将来的に BigDecimal が来ることなどの理由から大きくしたい Normative Change。大きくしすぎるとセキュリティの脆弱性を引き起こす恐れがあるらしいためとりあえず100文字になっている。承認された。
Stage 4 (ES2024)
N/A
Stage 3
Iterator Helpers: small optimisation to avoid String wrapper objects (PR) (slides) | Michael Ficarra Iterator.from で String のプリミティブラッパーオブジェクトを作らないようにするちょっとした最適化が入った。
Import attributes updates (slides) | Nicolò Ribaudo assert キーワードが互換性のため Normative Optional, Legacy だったのが Normative Optional, Deprecated に変わり、既に実装されて広く使われている V8 以外のエンジンでは実装されない方向になりそう。
ちなみに sosuke さんによると Prettier が assert と with の両方の対応をしていて大変そう。
@__sosukesuzuki: @cloud10designs @petamoriken ちなみに、Prettier に新しい Import Attributes を実装するときに、両方サポートをするのがめんどうくさかったので Import Assertions の方を消そうとしたら他のメンテナーに止められたので、Prettier では両方フォーマットできる形で(少なくともしばらくは)残ります。 Set methods: deferring callability check (issue) / handling negative sizes (issue) | Kevin Gibbons IsCallable のチェックを遅延させ、引数にやってくる SetLike が "size" を負数で持つときに RangeError を投げる Normative Change。
TypedArrat#copyWithin などで細かい Normative Change がなされた。
Intl.Locale#firstDayOfWeek の返り値が整数値だったが、UTS35 に倣って文字列に変更する提案。"mon", "tue", "wed", "thu", "fri", "sat", "sun", undefined を返す。合意はできなかった。
また細かい修正がなされた。
https://gyazo.com/07dc019bfcd4d9d5392097a27e2efda9
IETF のプロセス待ち。
NaN を 0 に丸めないなどのいくつかの Normative Change があった。
Moddable XS や Engine 262 で実装が進められている。また TypeScript 5.2 beta や Babel 7.22.0 でトランスパイルが可能になっている。
配列をグループ化する提案。{Object, Map}.groupBy として進んでいたが、無事 Stage 3 になった。
const { promise, resolve, reject } = Promise.withResolvers() の提案。Promise を継承したクラスでどう扱うか、また receiver (this) ない場合に例外を投げるべきかどうか議論された。Stage 3 になった。
前回から Editional Change と細かなバグが修正された。そして Temporal.TimeZone#equals が追加された。Stage 3 になった。
import source で WebAssembly.Module をモジュール依存ツリーに入れることができるようにする提案。
code: js
import source esbuild from "./esbuild.wasm";
const instance = await WebAssembly.instantiate(esbuild, { "go": goRuntime });
Dynamic Imports のシンタックスが import.source() になった。Stage 3 になった。
Stage 2
import defer でモジュールの解決とパースはするものの、モジュールの実行は変数を最初に触ったときに起きるようにする提案。Stage 2 になった。
Stage 1
Math に整数に関するスタティックメソッドを追加する提案
Modulus
Math.mod(x, y) – IEEE 754 modulus
👉 個人的に %% 演算子として欲しい。
i32 演算
Math.idiv(x, y) – Int32 division
Math.imod(x, y) – Int32 modulus
Math.imuldiv(x, y, z) – Int32 multiply and divide with 64-bit intermediate result - (x * y) / z
Math.irem(x, y) – Int32 remainder (integer equivalent of % operator)
Random
Math.irandom() – Int32 value from 0 to 2147483647 (inclusive)
Math.irandom(x) – Int32 value between 0 and x - 1 (inclusive)
Math.irandom(x, y) – Int32 value between x and y - 1 (inclusive). This matches the behavior of getRandomInt example on MDN.
Stage 1 になった。
Decimal を入れるべく調査中。前回 BigDecimal にするか IEEE754 の Decimal128 にするか議論されていたが後者になりそう? シンタックスとしては 123.456_789m のように m suffix を使う。
TypedArray の Uint8ClampedArray に対する DataView メソッドがないミッシングピースを埋める提案。
https://gyazo.com/2279689ceaf932f0b02782572ba50127
Stage 1 になった。
現状 Optional Chain は代入演算の左辺で扱えない。それを扱えるようにする提案。Swift などの言語にあるやつ。
code: js
if (obj != null) obj.prop = value;
// ↓
obj?.prop = value;
Stage 1 になった。
その他
各提案のメタレビュー Stage 2, 3 で長いこと議題にならずに放置されているものが共有された。
reducing wasted effort due to proposal churn (slides) (warning: 🌶️ spicy) | Michael Ficarra Stage 2 と 3 の間に新たな Stage プロセスを入れることが提案された。各エンジン実装の前段階。
https://gyazo.com/b7623b0cbceb2a36c986d77d27441d18
Stage 2¾ は面白い。
https://gyazo.com/d10850c5958fc63a67d1be586ec52a46
気持ちはわかる。ただ実装としては推奨しないが、実装してみないことにはわからない部分もあり、今までのステージで問題ないとのことでプロセスに変更はなかった。
Stop coercing things (slides) (also 🌶️ spicy) | Kevin Gibbons 自分が ES Discourse で議題にしたやつのように、配列のメソッドの引数にインデックスを渡すと ToIntegerOrInfinity であらゆる型のものが number になる問題がある。他にもあらゆるところで丸められている問題がある。 https://gyazo.com/0736cdbd16d1e732392ceed6e862bc53
これらを今後どうしていくかの議論。
今後新しい提案については基本的にやめていくとのこと。
Using WebAssembly as a polyfill for ECMAScript proposals (especially those in ECMA-402 via ICU4X) (Slides) | Shane F. Carr (prefer Wednesday or Thursday) (特に)Intl の ICU4X を WebAssembly を使って polyfill 出来ないかどうかの話。
総括
今回はどちらかといえば Stage 3, 2 で放置されている提案のメタレビューが印象に残った。