[ECMAScript] Pipe operator 論争まとめ – F# か Hack か両方か
※ 2021/09/15 時点の話です。議論が活発なので、これからどう流れるか分かりません。この記事ではたくさんのリンクを貼っていますが、議論の焦点を理解するにあたって最も重要なリンクはこれです。
- TC39 Pipeline Operator – Hack vs F#
https://benlesh.com/posts/tc39-pipeline-proposal-hack-vs-f-sharp/
2 つの仕様案
TC39 の Pipe operator (以前は Pipeline operator と呼ばれていました、 Wikipedia によれば Pipe operator を日本語で「パイプライン演算子」と呼ぶようです)のプロポーザルには少なくとも 2 つの異なる仕様案「F# pipe」と「Hack pipe」があります。以前はこれらを組み合わせた「Smart mix」案もありましたが、候補から外れたようです。
- tc39/proposal-pipeline-operator: A proposal for adding the simple-but-useful pipeline operator to JavaScript.
https://github.com/tc39/proposal-pipeline-operator
別のプロポーザルとして、関数の部分適用を簡単に書く構文も提案されており、 F# pipe と部分適用構文とを組み合わせれば Hack pipe とよく似た書き方ができるようになります。
- tc39/proposal-partial-application: Proposal to add partial application to ECMAScript
https://github.com/tc39/proposal-partial-application
それぞれの使用例 / Pros / Cons は次の記事によくまとまっています。記事を書いた Ben Lesh (@benlesh) さんは RxJS のコアメンバーです。この記事を紹介するツイートの返信や引用リツイートには多くの意見が寄せられています。
- TC39 Pipeline Operator – Hack vs F#
https://benlesh.com/posts/tc39-pipeline-proposal-hack-vs-f-sharp/
オープンな議論は基本的に次の Gist で行われているようです。
- Comparing the three pipeline proposals
https://gist.github.com/tabatkins/1261b108b9e6cdab5ad5df4b8021bcb5
RxJS 界隈や関数プログラミング界隈(Ramda 界隈含む)では F# pipe の採用が期待されています[要出典]。
ちなみに Stage 1 になる頃までの仕様案は今でいう F# pipe でした。
- tc39/proposal-pipeline-operator at 525884384277b97a2d8d0d1346d8f4f71f8cb970
https://github.com/tc39/proposal-pipeline-operator/tree/525884384277b97a2d8d0d1346d8f4f71f8cb970
Stage 2 の反響
そんな Pipe operator プロポーザルが Stage 2 に進みました。採用されたのは Hack pipe です。このプロポーザルのチャンピオンのひとりである James DiGioia (@mAAdhaTTah) さんが Hack pipe を宣伝する記事を公開しています。
- Hack Pipe for Functional Programmers: How I learned to stop worrying and love the placeholder
https://jamesdigioia.com/hack-pipe-for-functional-programmers-how-i-learned-to-stop-worrying-and-love-the-placeholder/
(8 月の TC39 meeting notes はまだ公開されていないようですが、 3 月の notes を見ると、この時点で発言者の多くが Hack pipe に惹かれているような印象です。また、 Daniel Ehrenberg (@littledan) さんがチャンピオンを降りて、 Hack pipe 派の Tab Atkins-Bittner (@tabatkins) さんがチャンピオンを引き受けるような話になっています。)
一方で、この決定には黙っていられない方々がいます。
- #200: Added value of hack-style proposal against temporary variables
https://github.com/tc39/proposal-pipeline-operator/issues/200 - #202: Separate (complementary) F# pipeline proposal?
https://github.com/tc39/proposal-pipeline-operator/issues/202 - #205: Hack is dead. Long live F#.
https://github.com/tc39/proposal-pipeline-operator/issues/205 - #206: Should enabling point-free programming/APIs be a goal of the Pipeline Operator?
https://github.com/tc39/proposal-pipeline-operator/issues/206 - #207: Hack pipeline in comparison to
let
and=
https://github.com/tc39/proposal-pipeline-operator/issues/207
F# pipe vs Hack pipe の直接的な議論である #205 の他にも、どうにか F# pipe も実現させたい #202 や Hack pipe は短い名前の変数への再代入と同じことだから要らないんじゃないかと指摘する #200 など、多くの Issue がここ数日で提起され議論されています。とても読み切れません。
#205 は論争がヒートアップして一部攻撃的なコメントが出てきてしまい、チャンピオンのひとり Tab Atkins-Bittner さんにクローズ&ロックされてしまいました。この強引な対応について #205 を立てた本人ともう 1 人が TC39 に訴えていますが…
- tc39/proposal-pipeline-operator debate concern · Issue #95 · tc39/how-we-work
https://github.com/tc39/how-we-work/issues/95 - TC39 and corruption, abuse of power · Issue #96 · tc39/how-we-work
https://github.com/tc39/how-we-work/issues/96
所感
いまのところ、このプロポーザルのチャンピオングループの意見は Hack pipe で固まっているようです。
(Ron Buckton (@rbuckton) さんは F# pipe 派だけど空気的に Hack pipe に反対できないって感じですかね…)
私は Pipe operator を切望しているというほどではありません(えっ)。ただ、もし F# pipe が採用されれば、それを前提とした便利なライブラリが登場したり、既存のライブラリがより使いやすくなったりするだろうという期待はあります。
もともとの提案である F# pipe で解決しようとしていた問題(の 1 つ)として、 jQuery や Lodash や RxJS のような多機能ライブラリの軽量化と拡張の容易化があったと思います。 jQuery はメソッドチェインで大成功しました。これを大きな一枚岩のクラスではなく小さな関数の集まりにして、メンバーアクセスによるメソッドチェインのかわりにパイプライン演算子でつなげて使うことにより、
- 必要な機能だけインポートしたり、既存のモジュールバンドラーの機能で Tree Shaking できます。未使用の機能のためにスクリプトを肥大化させずに済みます。
- 新しい関数を定義するだけでライブラリを拡張できます。既存クラスに手を入れずに済みます。
この目的に照らせば、 Hack pipe は中途半端な案だと感じます。
実のところ、 #200 や #207 で指摘されているように、 Hack pipe はただ中間変数をなくすだけの存在と言っても過言ではありません。ないよりはあった方が便利だとは思いますが、 F# pipe のようなインパクトはありません。
そんな感じです。
私としては、みんながこの件についてどう思っているのか、非常に興味があります。
2021-09-19 追記
Hack pipe を推し進めたことで開発者の多くを失望させたことについて、チャンピオングループのひとりである J. S. Choi (@js-choi) さんが謝罪しています。その上で、これまでの経緯を HISTORY.md にまとめたり、いくつかの Issue を立てています。 TC39 と開発者コミュニティとの間を取り持とうとしてくれているようです。
8 月の TC39 meeting notes の PR が出ています。
- Add notes for 2021-08 plenary by robpalme · Pull Request #153 · tc39/notes
https://github.com/tc39/notes/pull/153 - Pipeline operator for Stage 2
https://github.com/tc39/notes/blob/bb3c92b6db94be6b10350a257057facab6ff6540/meetings/2021-08/aug-31.md#pipeline-operator-for-stage-2
2021-09-27 追記
急速に大量のコメントがついた Issue を自動的にロックするボットが導入されました。モデレーターを務める TC39 メンバーが議論を確認して問題なければロック解除する運用のようです。
- #231: Floodgate Bot
https://github.com/tc39/proposal-pipeline-operator/issues/231
また、このプロポーザルの重要な変更を発表する専用 Issue が立てられました。議題ごとの Issue を追うことなく最新の仕様を差分で知りたいなら、基本的にはこの Issue だけ追えば OK ということだと思います。
- #232: Official changes thread
https://github.com/tc39/proposal-pipeline-operator/issues/232
(余談ですが、冒頭で紹介した比較記事 TC39 Pipeline Operator – Hack vs F# の執筆者 Ben Lesh (@benlesh) さんの失望感がすごいです。)
2021-10-04 追記
|>
を将来の(端的に言えば F# pipe の)ために残しておいて、 Hack pipe は |:
にしよう、という提案があります。 批判的な顔 😐 に見えるため、悪いコードを恥だと思わせて書かないよう仕向ける効果も?
- #237: Viability of using |: as the operator for Hack-style
https://github.com/tc39/proposal-pipeline-operator/issues/237
いくつかの高階関数を標準ライブラリで提供しようというプロポーザルが作成されています。 Function.compose
, Function.constant
, Function.identity
, Function.pipe
, Function.pipeAsync
が含まれています。 README には “What happened to the F# pipe operator?” という一節があります。
- Function helpers for JavaScript
https://github.com/js-choi/proposal-function-helpers
その他の記事
Other Articles
関連職種
Recruit