📚

[UEFN][Verse]常に失敗する失敗許容関数"Fail[]"の実装

2023/09/25に公開

現在プログラミングに使える可処分時間の大半を、11月の技術書典に向けた同人誌執筆に使っていてブログを更新出来てないんですが、ちょっと感銘を受けたので簡易更新。

Verseでコードを書いていると「常に失敗する式」が欲しい時があります。例えばデバッグ時にif式のロールバック時フローを確認したい時に、サクッと条件を失敗させられると便利なのです。

では、この「常に失敗する式」はどう書けばいいのでしょうか? Verseに多少慣れないとパッとは出てこないかもしれません。土屋も当初は「そういう専用の命令があるに違いない」と思い違いをしていました。

「常に失敗する式」は、詰まるところ成立しない式なので、以下のようなコードになります。

1=0
0>1
true = false

上記のような、定数による成立しない比較式は常に失敗します。土屋はよくこのようなコードを書きます。

ただこれ、「常に失敗する式」である事が自明でない(難しく言うと自己言及性が低い)ので、もうちょっと上手いコードにしたい所です。

ちなみに、正しく自己言及的なコードは恐らくこうです。

false?

後置の"?"はlogic型を受けるクエリ演算子で、値がfalseなら失敗します。ここでは定数falseをクエリ演算子が評価してるので、常に失敗します。

ただ、このコードは確かに自己言及的ではあるのですが、じゃあこれを読んで「常に失敗する式」だと認識するのは、それはそれで難しいか……ともやもやしたり。

常に失敗する関数"Fail[]"

そんな中、有名なUEFNデベロッパーで、公式フォーラムでも優れた投稿が多いKamyker氏が、Xwitterで興味深い投稿をしていました。

https://twitter.com/kamyker/status/1705343166315122740

これだー! 関数にしちゃえば良かったんだー! なんで気付かなかったかな……。

Fail<public>()<dicides><transacts>:void={
    true = false
}

一回これを書いておけば、あとは任意の失敗コンテキスト内でFail[]と書けば、この関数が評価された時点で失敗します。便利!

補足:失敗許容関数内でFail[]を使うべきかの是非

本文で敢えて書かなかったんですが、「常に失敗する式」が欲しい(恐らくより切実な)もう一つの場面として「失敗許容関数[1]内で、明示的に呼び出し元に失敗を返したい時」があると思っています。

ただこれ、Verseの設計思想的には避けるべき処理フローなのではないか? と思い、本文では触れませんでした。というのも、Verseにおける「失敗」は常に実行時例外処理、つまり全部try-catchであると考えるべきで、他の言語のif-then-elseの真偽分岐とはセマンティクスが違う物だと考えているからです。

とはいえ、正直失敗許容関数がバリバリ出てくるようなコードを書いた事がまだ無いので確信は持てていません。これは今後の課題ということで。

お知らせ

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

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

#Verse #UEFN #Fortnite #Verselang #UnrealEngine

宣伝

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

脚注
  1. decidesエフェクト指定子が付与された関数の事 ↩︎

Discussion