MEP 22: パイプライン演算子
- Created: 2025-06-19 11:56:00
- Updated: 2025-06-20 12:19:00
- Status: Supported(v1.0.01)
モチベーション
現状は ... のシンタックスシュガーを用いて、以下のように書ける。
let col = gamma2linearA(...)
to_ncolor(inputEx(*pxy))
ただ、意味的な事を思えば、順番的には逆にしたい。最初にto_ncolorしてからgamma2linearAするのだから、その順序で書けるようにしたい。
そのためにパイプライン演算子を導入したい。
提案
以下のように、 |> 演算子と、その後の関数の ... でパイプライン演算子を実現する、というのはどうだろう?
let col = to_ncolor(inputEx(*pxy)) |>
gamma2linearA(...)
多段にする場合は以下のようになる。
let col = inputEx(*pxy) |>
to_ncolor(...) |>
gamma2linearA(...)
検討事項1: 次の行に書けるべきか?
本来は以下のようにパイプライン演算子を次の行の先頭に書きたい。
let col = to_ncolor(inputEx(*pxy))
|> gamma2linearA(...)
だが、これはノート: 改行の扱いについて にあるように、以下のケースのルールと異なる。
let a = 3
-5
先読みをして特別扱いをするようにも出来るけれど、演算子によって挙動が変わるのはバグの温床になりそうなので、 MFGではこの記述は出来ない、という形で統一したいから、パイプライン演算子を次の行に書くのは出来ない、とした方が良いのではないか。
ただパースとして曖昧なのは単項演算子の - だけの問題なので、-だけを特別扱いして他は許すのもルールとして複雑な訳では無い。
ただ、MFGでは行の終わりが二項演算の式の終わり、という方がわかりやすいルールにも思う。
そこで次の行には書けない、というルールにしたい。F# などはオフサイドルールとの兼ね合いで特別扱いしているが、オフサイドルール無しで同じような例外を設けるのは良くないと判断。
行を継続したい時は2項演算子で行を終わらせる、で統一しておけば、パイプライン演算子で行が終わるのも自然に感じられるかもしれない。
次の行に書きたい場合はエスケープは出来る。
let col = to_ncolor(inputEx(*pxy)) \
|> gamma2linearA(...)
こうすれば、パイプラインの1行をまるごとコメントアウトする事は出来る。間をコメントアウトする事は出来ないが。
検討事項2: プレースホルダーは ... で良いのか?
... は既に「その関数呼び出しの次の式をそこに入れる」という意味でifelのシンタックスシュガーで使われている。 パイプライン演算子の時はこの意味が変わり、「その関数呼び出しの前の式をそこに入れる」という意味になる。
同じ記号が前と後ろという反対の意味になってしまうのはややこしいかもしれない。
デメリットは同じ記号が違う意味になるのでややこしいところ。 メリットはキーワードが増えてややこしくならないところ。
... は外の式をそこに置く、という意味では両者の意味は近いとも言える。
また、パーサーとしては ... を特別扱いしたツリーを作り、それを変形して解決するという構成になっていて、 前半に関しては全く同じルールになるのでコードは再利用出来る。 パースのルールとして同じになるというのは同じ記号を使うべき、という事を示唆しているかもしれない。