verse言語の設計思想を読み解きたい(4)失敗コンテキスト:②for式の述語部
前回はこちら
今回はfor式です。
補足:定数について
本題の前に、以前の記事で定数についての説明が不足していたので補足しておきます。
verseにおける定数(Constants)はいわゆるimmutable variableでして、C#のconstと違って、リテラルだけでなく動的な値でも初期化できます。初期化した後は(定数なので)変更できません。
この挙動はC#のreadonlyに近いと言えるかもしれません。ただし、verseの定数はローカルでも定義できます[1]。スコープはそのローカルの範囲になります。
なお、イテレーションされるコードブロック内で定数を定義している場合は、各イテレーション毎に新規に定数が定義されます[2]。
以上補足でした。何分勉強中なもので、今後もこんな感じで適宜補足や訂正が入ると思います。最終的には技術同人誌に纏められればいいなと思っているけど、出来るかな……?
②for式の述語部
for式のサンプルコードを以下に示します。この式は、SomeFunction()が返す値が10未満だった場合に、その値を最大5回返します。
Values := for ( X := 1..5; Y:=SomeFunction(X); Y < 10):
Y
for式の述語部[3]は失敗コンテキストです。ここでは失敗コンテキストに関係する箇所のみ説明します。
for式の述語部に記述出来る式は、その挙動に応じて「ジェネレーター式[4]」「フィルター式」「定数定義」に分類されます。
分類 | サンプルコード |
---|---|
ジェネレーター式 | X := 1..5 |
定数定義 | Y:=SomeFunction(X) |
フィルター式 | Y < 10 |
述語部には複数の式を記述できます。記述する順番は任意ですが、最初の式はジェネレーター式でなければいけません。
述語内の式が1つでも失敗した場合、その時のイテレーションは実行されず(if式と同じく、述語部内の式は全て実行されなかった事になります)、次のイテレーションが実行されます。失敗してもfor式が終了するわけではないので注意してください。
ジェネレーター式
for式がイテレーションする回数を配列、範囲式、mapのいずれかで指定します。範囲式(ここでは"X := 1..5")はfor式の述語部など、決められた場所でしか記述できません。
ちなみに、ジェネレーター式を複数記述すれば、単一のfor式でもネスト処理(のような物)が出来ます。
定数定義
if式と同様に、述語部で定義した値はコードブロック内で参照できます。
フィルター式
各イテレーションの実行条件を示す論理式です。
for式の失敗コンテキストの扱いについて。
公式ドキュメントでは、「for式内のイテーレション式とフィルター式[5]」が、失敗コンテキストとされています。
「イテレーション式」は、ジェネレーター式の表記揺れかと思います[6]。配列やmapにアクセスする際に失敗する可能性があるのでしょう[7]
定数定義が失敗コンテキストに含まれていないのですが、恐らくフィルター式に含んでいるのでしょう。
続き
verse言語とUEFNの記事を他にも書いているので御覧下さい。
最後まで読んで頂きありがとうございました。この記事がお役に立てたようであれば、是非LIKEとフォローをお願いします(今後の執筆のモチベーションに繋がります)。
#Verse #UEFN #Fortnite #Verselang #UnrealEngine
-
readonlyに相当する物(コンストラクタで定義されるimmutableなクラスメンバ)もあります ↩︎
-
それはもはや定数なのかという気もするけど、用語がそうなってるんだから仕方ない ↩︎
-
公式ドキュメントでは「for式の括弧内」という表現が多く見られ、preducateと直接呼称している記述はありません ↩︎
-
公式ドキュメントでは"generator" ↩︎
-
The iteration expressions and filter expressions in for expressions ↩︎
-
あるいは"iteration expressions"の事をgeneratorと呼ぶのかも ↩︎
-
多分。配列やmapの時に改めて確認します。 ↩︎
Discussion