🐡

Verse言語の設計思想を読み解きたい(6)失敗コンテキスト:④not演算子のオペランド

2023/04/08に公開

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

引き続き失敗コンテキストの話です。今回はnot演算子について。
https://dev.epicgames.com/documentation/ja-jp/uefn/operators-in-verse
事前に説明が必要な「オペランド」「演算子の形式」「決定演算子」の後、not演算子の仕様と、関係する失敗コンテキストについて見てみます。

前提説明:「オペランド」「演算子の形式」「決定演算子」

オペランド

オペランド(operand)」は、「演算子(operator)」と対をなす用語で、日本語では「被演算子」と訳されます。文字通り、演算子が影響するコード部の事を意味します。

-3.0

上記の式の場合、"-(マイナス演算子)"が演算子、"3.0"がオペランドになります。

演算子の形式

Verseの全ての演算子は、その演算子に対してオペランドがどの位置に記述されるかによって「前置形式(prefix format)」「中間置形式(infix format)」「後置形式(postfix format)」に分類されています[1]

各形式のサンプルの式と、その中の演算子とオペランドの対応を以下に示します。大体字面からのイメージと同じかと思われます。中間値形式の場合のみオペランドを2つ取る点に注意して下さい。

演算子の形式 サンプルコード 演算子 オペランド
前置形式 - 3.0 - 3.0
中間置形式 PlayerFallHeight > 3.0 > PlayerFallHeight と 3.0
後置形式 isMorning? ? isMorning

決定演算子

Verseでは、not/and/orの各演算子は「決定演算子(decision operator)」に分類されています。クエリ演算子が「クエリ式」を作れるように、決定演算子は「決定式(decision expressions)」を作る事が出来ます。決定式は決定演算子とオペランドから構成されます。

決定式は、各オペランド評価時の成功/失敗に応じて、呼び出し元に成功/失敗を返します。各オペランドは失敗許容式を記述できます。
決定式は失敗コンテキスト内でしか記述できません。これは決定式自体も失敗許容式だからです。

なお、公式ドキュメントでは"decision"の訳語が「決定」「判定」「判断」などで揺れているようです。このブログではひとまず「決定」に統一しています。

not決定演算子

not決定演算子は、自身の直後にオペランドを取る前置形式の演算子です。not式は、オペランド評価時の成功/失敗を反転した結果を返します。and式は決定許容式です。

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

not expression

expressionがnot演算子のオペランドです。オペランドには失敗許容式を記述できます。
オペランドが失敗した場合、決定式は(反転して)成功します。決定式はtrueを返します。
オペランドが成功した場合、決定式は(反転して)失敗します。決定式は値を返しません。また、この場合expressionは実行されなかった物とされます。

オペランドの「成功/失敗」の基準が「true/falseのどちらを返すか」ではない点に注意しください。失敗許容式は、常に「成功する(値を返す)」あるいは「失敗する(値を返さない)」の、いずれかの結果になります。

失敗コンテキスト:④not演算子のオペランド

not式において、not演算子のオペランドは失敗コンテキストです。

これは、オペランドの失敗/成功を元にnot式が評価される事を意味します[2]。別の言い方をすると、失敗コンテキストはネスト可能で、一番深い層から順番に失敗が伝播するのです[3]

もし失敗コンテキストがネストしないフラットなスコープを持つとした場合、not演算子のオペランド(これは失敗許容式です)が失敗した時点で、not式を含む失敗コンテキスト全体が失敗してしまうので、このような仕様になっているのだと思います[4]

補足:"not not expression"の公式訳について

https://dev.epicgames.com/documentation/ja-jp/uefn/operators-in-verse

公式ドキュメントのnot演算子の項で、not演算子を2重に重ねるというテクニックが解説されているのですが、その文章に誤訳が含まれていると思われます[5]。以下に私訳を示します。

原文:You can use not not expression as a way to check if an expression will succeed but make it so the expression never happens.
公式訳:式が成功するかを確認するために not not expression を使用できますが、その式が実際に実行されないようにする必要があります。
私訳:"not not expression"という形式を使うと、ある式が成功するかどうかを確認し、その上で、その式を実際には実行させないという事が出来ます。

続き

https://zenn.dev/t_tutiya/articles/60a066170964f1


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

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

#Verse #UEFN #Fortnite #Verselang #UnrealEngine

脚注
  1. 訳語は独自の物です。公式ドキュメントでは「インフィクス形式」のようなカタカナ表記になっています ↩︎

  2. 公式ドキュメントにこのように明文化されているわけではありませんが、そう解釈するのが自然と考えました。間違いが判明したら修正します ↩︎

  3. 「失敗コンテキストはネストする」と明文化されているわけでもありません。これもそう解釈するのが自然と考えました ↩︎

  4. 繰り返しますがこれらは明文化されているわけではありません ↩︎

  5. ただまあこれは元の処理が複雑なので仕方ないと思う ↩︎

Discussion