Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第9章. パイプライン演算子

この章の目的

この章を読み終える頃には、左から右に読める変換の連鎖を書けるようになります。この章を読み終える頃には、左から右に読める変換の連鎖を書けるようになります。

変換の連鎖

ギタリストは信号をエフェクターのチェーンに通します。音はギターを出て、最初のペダルに入り、変化して出て行き、次のペダルに入り、と続きます。チェーンは一つの方向に読み、各段が次の段に渡します。ギタリストは信号をエフェクターのチェーンに通します。音はギターを出て、最初のペダルに入り、変化して出て行き、次のペダルに入り、と続きます。チェーンは一つの方向に読み、各段が次の段に渡します。

プログラムはよく値に対して同じことをします — 出発点となる値を取り、ある関数に通し、その結果を次の関数に通す、というように。これを普通の関数呼び出しとして書くと、内側へ入れ子になっていき、読むときは真ん中から始めなければなりません。Keleusmaはより明快な書き方を提供しています。プログラムはよく値に対して同じことをします — 出発点となる値を取り、ある関数に通し、その結果を次の関数に通す、というように。これを普通の関数呼び出しとして書くと、内側へ入れ子になっていき、読むときは真ん中から始めなければなりません。Keleusmaはより明快な書き方を提供しています。

パイプライン演算子

パイプライン演算子は|>と書きます。式x |> f(args)の意味は、「xを最初の引数として、それに続けてargsを渡して、fを呼び出す」というものです。左側の値を取って、右側の呼び出しの最初の引数として通します。パイプライン演算子は|>と書きます。式x |> f(args)の意味は、「xを最初の引数として、それに続けてargsを渡して、fを呼び出す」というものです。左側の値を取って、右側の呼び出しの最初の引数として通します。

fn up(note: Word, semitones: Word) -> Word {
    note + semitones
}

fn main() -> Word {
    60
    |> up(7)
    |> up(5)
}

keleusma runで実行します。出力は次のとおりです。

72

連鎖を上から読んでみます。出発点の値は60、ミドルCのMIDIナンバーです。次の行|> up(7)up(60, 7)を呼び、音を完全五度上げて67にします。さらに次の行|> up(5)up(67, 5)を呼び、その音を完全四度上げて72にします。五度の上に四度を積むとオクターブになり、確かに72はミドルCの1オクターブ上です。連鎖を上から読んでみます。出発点の値は60、ミドルCのMIDIナンバーです。次の行|> up(7)up(60, 7)を呼び、音を完全五度上げて67にします。さらに次の行|> up(5)up(67, 5)を呼び、その音を完全四度上げて72にします。五度の上に四度を積むとオクターブになり、確かに72はミドルCの1オクターブ上です。

パイプラインの利点

パイプラインを使わずに同じプログラムを書くと、up(up(60, 7), 5)になります。これも正しく動きますが、内側から読むことになります。出発点の値60は真ん中に埋もれ、最初に適用するup(7)は2番目の中に入れ子になっています。パイプライン版では60が先頭に置かれ、各ステップが起こる順に並びます。音楽が動く順序のとおりに、変換が一つまた一つと進んでいくように読めます。パイプラインを使わずに同じプログラムを書くと、up(up(60, 7), 5)になります。これも正しく動きますが、内側から読むことになります。出発点の値60は真ん中に埋もれ、最初に適用するup(7)は2番目の中に入れ子になっています。パイプライン版では60が先頭に置かれ、各ステップが起こる順に並びます。音楽が動く順序のとおりに、変換が一つまた一つと進んでいくように読めます。

この章のまとめ

  • x |> f(args)は、xを最初の引数としてfを呼びます。
  • パイプラインは変換を連鎖させ、起こる順に上から下へ読めるようにします。
  • パイプラインは、入れ子の関数呼び出しになるはずだったものをより明快に書き直す方法です。パイプラインは、入れ子の関数呼び出しになるはずだったものをより明快に書き直す方法です。

これで第2部は完了です。値に名前を付け、関数を書き、判断し、動作を繰り返し、変換を連鎖させられるようになりました。第3部では、より大きなデータの形を組み立てることに移ります。これで第2部は完了です。値に名前を付け、関数を書き、判断し、動作を繰り返し、変換を連鎖させられるようになりました。第3部では、より大きなデータの形を組み立てることに移ります。