🦁

Verse言語の設計思想を読み解きたい(18)失敗コンテキスト:⑦logic型の初期化式(失敗許容式の結果に応じて真偽値を返す)

2023/05/01に公開

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

以前、公式ドキュメントに明記されている6種類の失敗コンテキストについて紹介しました。今回ドキュメントを眺めていて、logic型の初期化式(logic式)も失敗コンテキストである事に気づきまして、追加で紹介します。

logic型

logic型はC系言語のbool型に相当し、true/falseのいずれかの値のみを持ちます。

Verseではtruefalseはそれぞれ論理リテラルです。変数の定義は以下の様に行います。

arg1: logic = true
arg2: logic = false

logic式

さて、logic型の定義には、論理リテラルを指定する以外にlogic式を使用する方法があります。

logic式のボディは失敗コンテキストであり、失敗許容式を記述出来ます。式が成功すればtrue、失敗すればfalseが返ります。

失敗許容式の結果に応じて真偽値を返す

logic式を使うと「失敗許容式の結果に応じてlogic型を返す」という処理を記述できます。

そのような関数を定義するサンプルコードを以下に示します。式の意味と変数定義のサンプルコードについては次の項を確認してください。

target() :logic = logic{GetRandomInt(0, 3) <> 0}

ブレス括弧内はコードブロックなので、以下の形式でも記述できます。失敗許容式であれば、複数の式を書く事もできるようです。

target() :logic = logic:
    GetRandomInt(0, 3) <> 0

公式ドキュメント未訳部分の私訳

今回の記事は、公式ドキュメントのlogic型のページにある「Convert Failable Expression to Logic」という項目を元にしています。

https://dev.epicgames.com/documentation/en-us/uefn/logic-in-verse

実はこの項目、日本語版のドキュメントにはありません。パッと見た限りでは他の多国語版にも掲載されていないので、後から追記され、かつローカライズが間に合っていないのだと思われます。

該当箇所の私訳を以下に載せておきます。

Convert Failable Expression to Logic

私訳:失敗許容式をLogic型に変換する

You can cast a failable expression to a logic type using logic{failable-expression}, where failable-expression is an expression that can fail.
私訳:logic{failable-expression}を使用すると、失敗許容式をlogic型に変換できます。failable-expressionが失敗可能な式にあたります。

In the following example, the failable expression GetRandomInt(0, MineFrequency) <> 0 is converted to the logic value false if the random integer is 0 and true otherwise.
私訳: 次の例では、GetRandomInt(0, MineFrequency) <> 0という失敗許容式がlogic型(ランダム値が0ならfalse、それ以外ならtrue)に変換されます。

IsMined := logic{GetRandomInt(0, MineFrequency) <> 0}

終わりに

「失敗許容式の結果に応じてlogic型を返す」というのは頻繁に書きたくなるコードでして、SNS上でも非日本語圏を含めて複数の方が方法を求めていたように思います。

なぜ公式ドキュメント上でとってつけたような扱いになっているのかは不明ですが、大胆に想像すると、言語設計時の想定では必要無い(=失敗許容式を直接参照すれば良く、その結果をストアする必要は無い)と考えていたが、実運用上無理が出たんじゃないかなーと思います(あくまでも想像です)。

#Fortnite #Verse #VerseLang #UEFN

続き

https://zenn.dev/t_tutiya/articles/0f758b633a3ba6

Discussion