ガード (プログラミング)のソースを表示
←
ガード (プログラミング)
ナビゲーションに移動
検索に移動
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループに属する利用者のみが実行できます:
登録利用者
。
このページのソースの閲覧やコピーができます。
'''ガード''' ('''Guard''') とは、コンピュータ・[[プログラミング言語]]において、[[条件演算子|条件式]]ないし[[分岐命令|条件分岐]]のような意味を持つもので、ある分岐で処理を続けるために真 (true) と評価されなければならない<ref>ないし、真 (true) として扱われる値(言語により異なる)でなければならない</ref>[[式 (プログラミング)|式]]である。偽の場合は残りの処理のほうに進む。[[パターンマッチング]]のある言語の、パターンマッチングの能力をより強化したものと見ることもできる。すなわち、パターンマッチングとして構造がマッチしていても、その構造の中身の値を評価した結果によってはスキップさせることが可能なパターンのようなもの、である。 == 例 == 以下の Haskell のコード例で、"|" と "=" の間の部分がガードである。 <syntaxhighlight lang="haskell"> f x | x > 0 = 1 | otherwise = 0 </syntaxhighlight> これは、以下のような、数学で使われる記法に似ている。 <math> f(x) = \left\{ \begin{matrix} 1 & \mbox{if } x>0 \\ 0 & \mbox{otherwise} \end{matrix} \right. </math> この場合、ガードは "if"節と "otherwise"節にある。 上記の例のように複数の<!--並列の-->ガードがある場合、先頭から順に評価され、最初に真となった分岐が選択される。<!-- 並列に評価される?確認できないのでコメントアウト(訳者) Guards in a list of cases are typically parallel. --><!--英語版の記述がどういうつもりだったかわかりませんが、Haskellの場合は明確に「上から順番に」です。「ガード」が名前にあるような並行言語などで、並列あるいは乱択といった言語も多いとは思いますが--> Haskell の[[リスト内包表記]]でのガード列は、1つでも偽であった場合にそのリスト要素が生成されない。これはつまり、個々のガードを[[論理積]]で結合したと見なすことができるが、リスト内包表記にはガード以外も列挙される。 == 言語 == ガードのような機能を持つ言語として、[[Haskell]]、[[Concurrent Clean|Clean]]、[[Erlang]]、[[occam]]、[[OCaml]]といった[[プログラミング言語]]や多くの[[並行論理プログラミング]]言語が挙げられる。[[Mathematica]]ではガードを''constraint''と呼ぶ。[[形式手法]]の言語である[[Guarded Command Language]](詳細は歴史の節で後述)でも重要な構成要素である。 == パターンガード == パターンガードとは、ガード内でパターンマッチングを行うこと(あるいはそのようなガード)である。この定義は Haskell について[[サイモン・ペイトン・ジョーンズ]]が [http://research.microsoft.com/Users/simonpj/Haskell/guards.html A new view of guards] として1997年4月に提案し、その後実装されている。 Haskell での例を示す。 <syntaxhighlight lang="haskell"> clunky env var1 var2 | Just val1 <- lookup env var1 , Just val2 <- lookup env var2 = val1 + val2 ...other equations for clunky... </syntaxhighlight> ここで、"<-" はパターンガード修飾子と呼ばれ、右辺を評価した結果を左辺とパターンマッチする。リスト内包表記のようにパターンガードを並べることができ、いずれかがパターンマッチに失敗すれば、その分岐は実行されない。 == 歴史 == 頭部に書かれた式(条件式)を評価した真偽にもとづき、最初に真になった所の対応する本体を評価した値を全体の結果とする、というような記法はプログラミング言語以前に数学で使われており、Haskellのものなどは以下の歴史よりも、むしろ数学における記法をそのまま取り入れたものに近い。1960年の「[[Lisp]]の論文」と呼ばれる''Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I''([[ジョン・マッカーシー|マッカーシー]])で導入された、 (p<sub>1</sub> → e<sub>1</sub>, ・・・, p<sub>n</sub> → e<sub>n</sub>) という記法もその一種と言え、その後のLispでは[[S式]]による記法が一般的になったものの、それでもLispの、<code>if</code>ではなく<code>cond</code>による条件式はこれに近い。 1963年の[[CPL (プログラミング言語)|CPL]]([[クリストファー・ストレイチー|ストレイチー]]他)にも似たものが存在しており、最初の部分式に対するガードが記述され、その後にガードが偽であった場合の部分式が記述される。例えば以下のように記述される。 (x>0) -> 1/x; 0 x>0 ? 1/x : 0 後半の部分式も条件付きの式として記述できる場合、以下のような記述が可能となる。 (x>0) -> 1/x; (x<0) -> -1/x; 0 1966年の[[ISWIM]](Landin([[:en:Peter Landin]]))では既に else 節に相当する部分のない条件付き式があり、ガードと二者択一の概念が分離されている。ISWIM では、どの分岐も真でない場合、全体として式の値は「未定義」とされ、値が計算されないと定義されていた。 プログラミング言語というよりは理論寄りで提案されたものだが、1975年<ref>[https://doi.org/10.1145/360933.360975 Dijkstra, E.W.: Guarded commands, nondeterminacy and formal derivation of programs. ''Commun. ACM 18'' (1975), 8: 453–457.]</ref>の[[Guarded Command Language]]([[エドガー・ダイクストラ|ダイクストラ]]、[https://www.cs.utexas.edu/users/EWD/transcriptions/EWD04xx/EWD472.html EWD472])もガードを多用する言語である。文献から引用すると、たとえば、xとyの最大値をmに求める記述はifとガードを使って、 '''if''' x ≥ y → m:= x ▯ y ≥ x → m:= y '''fi .''' となる。さらに、繰返し評価を行うdoは次のような記法で、 '''do''' ql > q2 → ql, q2 := q2, ql ▯ q2 > q3 → q2, q3 := q3, q2 ▯ q3 > q4 → q3, q4 := q4, q3 '''od .''' いずれかの条件が成立する限り繰り返す(ifの場合と違い、doでは複数の条件が成立した場合はいずれかが選ばれる)。 1976年のSASL([[:en:SASL (programming language)]]<ref>初出は1972年となっているが、何度か更新している。</ref>, [[:en:David Turner (computer scientist)]])は「ガード」という用語を使った初期のプログラミング言語の1つであり、関数の定義を複数持たせて、ガードによって適用する定義を選択するようになっていた。これは細かい表面上の違いを除けば、後のHaskellにおける記法のガードの位置を後ろにもってきたようなものであり、あるいはHaskellのそれ以上に数学における記法に似ている。 fac n = 1, n = 0 = n * fac (n-1), n > 0 1980年代の[[Guarded Horn Clauses]](上田)もガードを多用する言語である。 ==参考文献== * [http://ftp.sunet.se/foldoc/foldoc.cgi?guard Guard] in ''The Free On-line Dictionary of Computing'', Denis Howe(Editor). * ''The Haskell 98 Report'', chapter [http://haskell.org/onlinereport/exps.html 3 Expressions]. * ''The Mathematica Book,'' section [http://documents.wolfram.com/mathematica/book/section-2.3.5 2.3.5 Putting Constraints on Patterns] * ''栄光のグラスゴーHaskellコンパイルシステム利用の手引き'' バージョン6.6、[http://www.kotha.net/ghc_users_guide_ja/syntax-extns.html#pattern-guards 7.3.2. パターンガード] ==注== <references/> {{デフォルトソート:かあと}} [[Category:制御構造]] [[Category:形式手法の用語]]
ガード (プログラミング)
に戻る。
ナビゲーション メニュー
個人用ツール
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
ソースを閲覧
履歴表示
その他
検索
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
特別ページ
ツール
リンク元
関連ページの更新状況
ページ情報