コンピュータプログラミングにおいて、フリップフロップとは、ブール値が最初の条件を満たしたときに偽から真に反転し、2番目の条件を満たしたときに偽に戻ることを可能にする、あまり使われない構文構造です。この構文は、プログラミング言語Perl [1]とRuby [2]で利用可能です。同様のロジックは、 sedとawk [1]でも利用可能です。
最初の条件 A と 2 番目の条件 B を持つフリップフロップは、「A かつ B でない」と同じではありません。これは、前者が永続的な状態を持ち、過去のある時点で A が真で、B が常に偽であった限り、A が真でなくなったとしても真であるためです。
良い例えとしては、A が真実ではなく、B が真実であるとしても、B は依然として A を信じる、ということになります。
例
次のRubyコードは、4 から 6 までの数字を出力します。
( 1 .. 10 ) .それぞれdo | x | puts x if ( x == 4 .. x == 6 ) end
最初の「..」は範囲演算子で、1から10までの整数の列挙を生成します。2番目の「..」はフリップフロップ演算子、またはフリップフロップ演算子とも呼ばれます。[3] 「x == 4」と「x == 6」はどちらも偽であるにもかかわらず、数値5が出力されていることに注意してください。これは、式が「x == 4」が前回の反復で真であったこと、そして「x == 6」がその時点では真ではなかったことを記憶しているためです。
落とし穴
フリップフロップ演算子は現在の状態を保存する必要があります。プログラマーがこの状態がどこに保存され、その有効期間がどのくらいかを明示的に定義する方法はありません。有効期間は、同じコードが複数のスレッドで使用される場合や再帰関数で使用される場合に重要です。フリップフロップ演算子の状態へのこれらの同時アクセスは、プログラミング言語によっては未定義の動作、あるいは少なくとも予期せぬ結果につながる可能性があります。例えば、Perlでは各フリップフロップ演算子は独自の状態を持ち、すべてのスレッドで共有されます。[4]他のプログラミング言語でも同様です。
この制限を回避するには、フリップフロップ演算子を抽象データ型としてモデル化し、次のようにパラメータ化する必要があります。
- フリップフロップをオンにするかどうかを指示する述語
- フリップフロップをオフにするかどうかを指示する述語。
このフリップフロップデータ型は、状態を照会し、同時に更新する関数を提供します。この関数は、スイッチング述語が依存する実際のデータを取得し、必要に応じてそのデータを2つの述語に渡します。
この固有の複雑さのため、フリップフロップ演算子を採用しているプログラミング言語はごくわずかです。
参考文献
- ^ ab 「Perlの演算子と優先順位」 。 2016年10月21日閲覧。
- ^ Nithin Bekal (2014年11月21日). 「Rubyのフリップフロップ演算子」
- ^ 「PyCon Australia Lightning talk: Flip Flop Operators (flip floperators)」. YouTube . 2018年8月26日.
- ^ 「Perlの範囲演算子」。2020年8月16日。