🤖

【UEFN/Verse】オブジェクト指向型や関数型風にVerseを書いてみる

2024/07/05に公開

何となく

マルチパラダイム。可能な限り 決定論的 になるようにするなど、関数型プログラミング、オブジェクト指向プログラミング、および 命令型プログラミング の長所を活かします。その例としては、データがデフォルトで 不変 となっており、コードとデータが同じであれば、結果は常にまったく同じになるといったことが挙げられます。

https://dev.epicgames.com/documentation/ja-jp/uefn/verse-language-reference

これまでずっとUnity/C#しか使ってこなかったため関数型プログラミングに触れる機会がありませんでした。そこでどのようなものか知りたいということで関数型プログラミングについて調べ始めました。

関数型プログラミングとは

ざっくりと

  • クラスを使わない
  • 状態とふるまいを切り離す
  • 入力と出力を意識する?(基本的に何かがreturnされる関数が多い)

https://qiita.com/stkdev/items/5c021d4e5d54d56b927c

Haskellを学べばより深みに行けるらしい、、、
https://qiita.com/arowM/items/0305d4f439752f285438

とりあえず書いてみる

オブジェクト指向型

クラス内部にふるまいを書く

#sample.verse
sample := class():

    var SamleValue : int = 0

    IncrementValue():void=
        set SamleValue += 1

#sample_controller.verse
sammple_controller := class():
    SampleClass : sample = sample{}

    Init()<suspends>:void=
       loop:
          Sleep(1.0)
          SampleClass.IncrementValue()

関数型

クラスの外にふるまいをかく
(まちがってるかも)

#sample.verse
sample := class():
    var SampleValue<public> : int = 0

#sample_behavior.verse
(InSampleClasss : sample).IncrementValue<public>():void=
    set InSampleClasss.SampleValue += 1

#sample_controller.verse
sammple_controller := class():
    SampleClass : sample = sample{}

    Init()<suspends>:void=
       loop:
          Sleep(1.0)
          SampleClass.IncrementValue()

まとめ

関数型でうまいこと抽象化することができれば一つのファイルに書き込むコード量が減ってきそうだと感じました!クラスを使わない言語ってちょこちょこ最近見かけるので今後もその書き方や良さについて理解していきたい。

Landelテックブログ

Discussion