ECMAScript data flow proposal 調べる
Holistic JavaScript dataflow proposals v2 を読んでdata flow proposalと呼ばれているプロポーザルについて調べている。
Pipe Operator
パイプライン演算子を追加する提案。F# Pipes と Hack Pipes があったが Hack が採用される流れらしい。
Hack Pipes は |>
の右側に任意の式を書け、プレースホルダーとして @
を書くとそこに左辺の値が入る。任意の式が書けるので他の 4 プロポーザルができないようなこともできる。
1 + x;
x |> @ + 1;
[...iter];
iter |> [...@];
await (await fetch("https://example.com/")).json();
await fetch("https://example.com/") |> await @.json();
個人的にはF#のほうがミニマルで好きだったが、Ramda.jsとかfp-tsみたいな狂った関数型ライブラリのユーザーしかうれしくないだろうと言われたら一巻の終わりなので致し方ないか。プレースホルダーは結局確定したのだろうか?
Function.prototype.call
プロポーザルではないんだけどcall-this operatorを理解するために必要なのでこれも読む。
f(arg1, arg2, arg3)
という関数を f.call(thisArg, arg1, arg2, arg3)
という形で呼ぶことでthisの値を指定しながら呼べる。
function add(other) {
return this + other;
}
console.log(add.call(1, 2))
Function.prototype.bind
f(param1, param2)
という関数を f.bind(thisArg, arg1, arg2)
という形で呼ぶことで渡した引数が埋まった状態の新しい関数が得られる。
function add(other) {
return this + other;
}
const add1 = add.bind(1);
const add1and2 = add.bind(1, 2)
console.log(add1(2));
console.log(add1and2());
call-this Operator
Extensionsのサブセット。fn.call(reciever, arg0)
を reciever:>fn(arg0)
と書けるだけ。
function add(other) {
return this + other;
}
console.log(1:>add(2));
Stage 0で止まっていたbind operatorというやつの後継であり、最初はbind-this operatorという名前
だった。その名前の通り Function.prototype.bind
の糖衣でもあったのだが、partial applicationとの兼ね合いで除去されて現在に至るっぽい。
function add(other) {
return this + other;
}
const add1 = 1::add;
const add1and2 = 1::add(2);
console.log(add1(2));
console.log(add1and2());
Extensions
機能がでかすぎてキレそう。読む気が起きない。