🐈

verse言語の設計思想を読み解きたい(2)失敗コンテキストとは何か

2023/04/04に公開

※相変わらず実機での動作検証がほぼ皆無で書いてるので、間違っている箇所が多々あると思われます。気づいたら後で直します。

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

verse言語学習の鬼門の1つではないかと想像されるのが「失敗コンテキスト(failure context)」だと思います。今回はこれについて勉強してみました。

失敗コンテキストは、C#で言う所の「論理式」「条件分岐」「例外処理」などの各要素を、「失敗する可能性のある(failable)」コードという1つの概念にまとめた物だと(土屋は)捉えています。

なのでまずは「failableなコード」からはじめましょう。

failable(失敗する可能性のある)な演算子/式/関数

verseでは、コードに含まれるすべての式[1]について、「失敗する可能性がある(failable)」か、そうでないかを厳密に区別しています。
https://dev.epicgames.com/documentation/ja-jp/uefn/failure-in-verse
公式ドキュメントでは以下の様に、様々なレベルで「失敗する可能性がある●●」が定義されています。

原文 公式訳
failable operator 失敗する可能性がある演算子
failable expression 失敗する可能性がある式
failable function 失敗する可能性がある関数

余談ですが(かつ余計なお世話ですが)、この「失敗する可能性がある」という訳語はあまりに冗長で、verseを学習する際の障害になるのではと危惧しています。とはいえ、ではどんな訳語が適切なのかと言うと難しい問題に思えます。少なくとも土屋にはしっくり来る物が思いつきませんでした。

ひとまず、このブログでは英語ドキュメントに合わせて「failable」とそのまま書く事にします。ちなみに読みは「フェイラブル」です。

failableなコードと失敗コンテキスト

「failableなコード」という物をイメージしにくいかと思いますが、ひとまずはC#のtry-throw-catchで例外が送出されるコードみたいな物だと考えてください。ただし、実際に失敗コンテキストがフォローする範囲はもっと広いです。

failableなコードは記述出来る場所が限定されています。この限定された場所の事を「失敗コンテキスト」と呼びます。これはverse独特の概念だと思います(少なくとも土屋はverse以外に見た事ありません)。

代表的な失敗コンテキストはif式の条件部(verseでは「述語」と呼ぶ)です。verseでは、if式の条件部が論理式である必要が無く、普通の式を(それも複数個)記述できます。これら式の全てが成功すればthen節が、1個でも失敗すればelse節が実行されます。

興味深いのは、式が失敗した場合、失敗コンテキスト内の処理がまるごとロールバックするというトランザクション処理が発生する点です(これについてはまたいずれ)。

失敗コンテキストの意義

なぜ単純な真偽式ではなく、失敗コンテキストなる機能が用意されているのかと言いますと、ひとえにバグを出さないためなのだと思われます。

多くの場合、バグは制御構造(分岐や繰り返し)の構築ミスで発生すると思います。逆に言えば分岐を減らせれば、その分(分岐にまつわる)バグの発生率を下げる事が出来ます。「いや分岐を減らすとか無茶言うなや」と思われるかもしれませんが、例えば関数型言語では分岐や繰り返しがそもそも言語仕様に含まれていない物もあり[2]、最近では手続き型言語のコーディングスタイルに転用される例もあります。

verseではデフォルトで「分岐は成功する物」として扱われます。成功しなかった場合は例外扱いな訳です(とはいえ失敗したからと言って例外送出されるというわけではないので注意。そもそもverseに例外処理は無い)。そして、その条件分岐が起こりうる(=failableな)箇所を限定する事で、事故が起きる余地をできるだけ減らそうとしている訳です。

うーん、やっぱりコード無しで失敗コンテキストを説明するのは難しいかー? 次はif式について勉強します。

補足:"failabe"という用語について

余談ですがこの"failable(フェイラブル。失敗可能)"はマイナーな英単語らしく、ググると大抵は「fallible(ファリブル。誤りを犯しがちな)の間違いでは?」と訂正されます。

"failable"についてパッと調べた感じでは用例が1682年まで遡るようで、verseではほぼ造語として使っているんじゃないか? と想像しています。あるいは、土屋が知らないだけで情報工学では一般的な単語だったりするんでしょうか?

補足2:"failable"の訳語について

この記事を書いた後、知人と話していて「失敗許容」ならアリなんじゃないかと感じました。nullableを「null許容」と訳す前例もありますし。「失敗許容演算子」「失敗許容式」「失敗許容関数」もイケる。

続き

https://zenn.dev/t_tutiya/articles/6e82a363763ac5


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

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

#Verse #UEFN #Fortnite #Verselang #UnrealEngine

脚注
  1. 前回も書きましたがverseには式しかありません(ただし値を返さない式はある。例えばloop式の戻り値はvoid)。 ↩︎

  2. 関数型言語に本当に分岐や繰り返しが無いわけではなく(それだと処理フローが構築できない)、例えば繰り返しは再帰で表すとか、分岐は多重定義で表すとかなどにより、より限定した(≒事故の少ない)記法を用いる場合があります。 ↩︎

Discussion