😊

Verse言語の設計思想を読み解きたい(7)and/or演算子&失敗コンテキスト:⑤or決定式の左オペランド

2023/04/09に公開
1

前回はこちら
https://zenn.dev/t_tutiya/articles/ab81ba020dd983

今回は残る決定演算子のand/orです。and決定演算子は失敗コンテキストを持ちませんが、分かりやすいのでここで説明しておきます。

and決定演算子

and決定演算子は自身の両側にオペランドを取る中間置形式の決定演算子です。and式は2つのオペランドの成功/失敗の組み合わせに応じて成功/失敗を返します。
and式は決定許容式です。

and決定演算子の構文は以下の様になります。

expression1 and expression2

expression1、expression2がand決定演算子のオペランドです。各オペランドは失敗許容式です。2つのオペランドが両方とも成功した時のみand式は成功します。オペランドのどちらか片方でも失敗したら、and式は失敗します。

and式は各オペランドをexpression1→expression2の順に評価し、それぞれのオペランドの成功/失敗の組み合わせによって以下の様に結果が変わります。

expression1が成功 expression2が成功

and式は成功します。
expression1/expression2の式はどちらもコミットされます。
and式はexpression2の結果を返します。trueを返すわけでは無いので注意して下さい。

expression1が成功 expression2が失敗

and式は失敗します。
expression1/expression2の式はどちらも実行されなかった物とされます(expression1の評価時の処理はロールバックされます)。
and式は値を返しません。

expression1が失敗

and式は失敗します。
expression1が失敗した時点でand式の評価は終了します(expression2は評価されません)。expression1は実行されなかった物とされます。
and式は値を返しません。

and式の失敗コンテキストについて

not/orの各決定演算子と異なり、and決定演算子のオペランドは失敗コンテキストではありません。これはand決定演算子が、オペランドの失敗の上位への伝播を制御しない(自動的に失敗を伝播する)ため、スコープを持たない事を意味しているのだと思われます。

or決定演算子

or決定演算子は自身の両側にオペランドを取る中間置形式の決定演算子です。or式は2つのオペランドの成功/失敗の組み合わせに応じて成功/失敗を返します。
or式は場合によって失敗許容式になります(後述)。

or決定演算子の構文は以下の様になります。

expression1 or expression2

expression1、expression2がor決定演算子のオペランドです。各オペランドは失敗許容式です。2つのオペランドのどちらか片方でも成功したらor式は成功します。オペランドの両方が失敗した時のみor式は失敗します。

or式は各オペランドをexpression1→expression2の順に評価し、それぞれのオペランドの成功/失敗の組み合わせによって以下の様に結果が変わります。

expression1が成功

or式は成功します。
expression1が成功した段階でor式は終了します。expression2は実行されません。
or式はexpression1の結果を返します。trueを返すわけでは無いので注意して下さい。

expression1が失敗 expression2が成功

or式は成功します。
expression1は実行されなかったとされます。
or式はexpression2の結果を返します。trueを返すわけでは無いので注意して下さい。

expression1が失敗 expression2が失敗

or式は失敗します。
expression1/expression2の式はどちらも実行されなかった物とされます。
or式は値を返しません。

or式が失敗許容式になる条件

or式は、オペランドが失敗許容式であれば、or式自体も失敗許容式になります。右オペランドが失敗許容式で無ければ、or式は常に成功するので、失敗許容式として扱われません。

以下のようなor式を考えます。Int[]関数は、float型をInt型に変換する失敗許容関数です。

Int[value1] or true

この式は常に成功するため、失敗許容式ではありません。そのため、失敗コンテキスト外で記述出来ます[1]

失敗コンテキスト:⑤or決定式の左オペランド

or式のオペランドは失敗コンテキストです。これはor決定演算子が、左オペランドの失敗を上位へ伝播する処理を制御している事を示します[2]

補足

ちなみに、日本語版の公式ドキュメントでは決定式の失敗コンテキストの範囲について「orやandに対する左オペランド」と記述されていますが、原文では"The left operand for or."となっており、恐らく原文の方が更新された(そして翻訳作業が追いついていない)のかと思われます。

続き

https://zenn.dev/t_tutiya/articles/488e4a0d7e119d

お知らせ

verse言語とUEFNの記事を他にも書いているので御覧下さい。
https://zenn.dev/t_tutiya

最後まで読んで頂きありがとうございました。この記事がお役に立てたようであれば、是非LIKEとフォローをお願いします(今後の執筆のモチベーションに繋がります)。

#Verse #UEFN #Fortnite #Verselang #UnrealEngine

宣伝

「Unityシェーダープログラミングの教科書」シリーズ1~5をBOOTHで頒布中です。
https://s-games.booth.pm/

脚注
  1. 記述出来ていいのかとは思うけど、言語仕様上は出来るしコンパイルも通ります ↩︎

  2. 明文化はされていません。not決定演算子の記事も参照してください ↩︎

Discussion

shunshun

「or式は、右オペランドが失敗許容式であれば、or式自体も失敗許容式になる」と書いていますが、「左右どちらのオペランドも失敗許容式であれば、or式自体も失敗許容式になる」の間違いではないでしょうか?
私の理解不足でしたら申し訳ございません。