ガード (プログラミング)

From Wikipedia, the free encyclopedia

ガード (Guard) とは、コンピュータ・プログラミング言語において、条件式ないし条件分岐のような意味を持つもので、ある分岐で処理を続けるために真 (true) と評価されなければならない[1]である。偽の場合は残りの処理のほうに進む。パターンマッチングのある言語の、パターンマッチングの能力をより強化したものと見ることもできる。すなわち、パターンマッチングとして構造がマッチしていても、その構造の中身の値を評価した結果によってはスキップさせることが可能なパターンのようなもの、である。

以下の Haskell のコード例で、"|" と "=" の間の部分がガードである。

 f x
   | x > 0     = 1
   | otherwise = 0

これは、以下のような、数学で使われる記法に似ている。

この場合、ガードは "if"節と "otherwise"節にある。

上記の例のように複数のガードがある場合、先頭から順に評価され、最初に真となった分岐が選択される。

Haskell のリスト内包表記でのガード列は、1つでも偽であった場合にそのリスト要素が生成されない。これはつまり、個々のガードを論理積で結合したと見なすことができるが、リスト内包表記にはガード以外も列挙される。

言語

ガードのような機能を持つ言語として、HaskellCleanErlangoccamOCamlといったプログラミング言語や多くの並行論理プログラミング言語が挙げられる。Mathematicaではガードをconstraintと呼ぶ。形式手法の言語であるGuarded Command Language(詳細は歴史の節で後述)でも重要な構成要素である。

パターンガード

パターンガードとは、ガード内でパターンマッチングを行うこと(あるいはそのようなガード)である。この定義は Haskell についてサイモン・ペイトン・ジョーンズA new view of guards として1997年4月に提案し、その後実装されている。

Haskell での例を示す。

 clunky env var1 var2
   | Just val1 <- lookup env var1
   , Just val2 <- lookup env var2
   = val1 + val2
 ...other equations for clunky...

ここで、"<-" はパターンガード修飾子と呼ばれ、右辺を評価した結果を左辺とパターンマッチする。リスト内包表記のようにパターンガードを並べることができ、いずれかがパターンマッチに失敗すれば、その分岐は実行されない。

歴史

参考文献

Related Articles

Wikiwand AI