コンテンツにスキップ

宣言

名前、型、関数などを新しく定義する記述を宣言と呼びます。Sobakasu では宣言の種類ごとに、記述できる場所が決まっています。

ソースの最上位には、主に次の宣言を置けます。

module ...;
use ...;
public use ...;
const ... = ...;
state { ... }
function ... { ... }
struct ... { ... }
enum ... { ... }
type ... = extern ...;
implementation ... { ... }
behavior { ... }

イベント処理が終わった後も保持する値は、state ブロックの中へまとめて宣言します。

state {
count: i32 = 0;
public label: string = field;
}

以前の state count = 0; のように、state を変数ごとに付ける書き方は現在使用できません。使用するとコンパイルエラーになります。

VRChat のイベント処理とネットワークイベントの受信処理は behavior ブロックへ記述します。

behavior {
on start {
log("start");
}
receive ping {
log("ping");
}
}

on や receive を behavior の外へ直接書くことはできません。

public は、その宣言を外部から利用できるようにするときに付けます。何に対して公開されるかは宣言の種類によって異なります。

  • public use — 取り込んだ名前を別のモジュールにも再公開する
  • public const / public function / public type など — モジュール外から利用できるようにする
  • state 内の public — Unity の Inspector などから設定できる状態変数として公開する
  • public receive — Udon から呼び出せるネットワーク受信処理として公開する

public を付けられない宣言に使用するとコンパイルエラーになります。

language item は、コンパイラが特別な役割を持つものとして認識する型や implementation を宣言するための仕組みです。主に Prelude や標準ライブラリの実装で使用します。

language item "maybe"
enum Maybe<T> {
Nothing,
Just(T),
}

通常のアプリケーションで独自の型を宣言するだけなら、language item は必要ありません。

宣言の直前に /// を書くと、その宣言に対するドキュメントコメントになります。

/// 2つの値を加算します。
function add(a: i32, b: i32) -> i32 {
a + b
}

/// の直後に対応する宣言がない場合はコンパイルエラーになります。