Skip to content

ADR-0004: Literal Syntax and Built-in Literal Types

This content is not available in your language yet.

Superseded by ADR-0005 (the null literal portion is additionally superseded by ADR-0026)

Sobakasu は VRChat Udon 向けの Udon-first 言語として設計されており、C# 互換ではなく、Udon の制約と実用性を前提とした独自の型体系と構文を採用する。

ADR-0001(アーキテクチャ決定の記録方針)、ADR-0002(Sobakasu 開発理由)、ADR-0003(コンパイラパイプライン設計)に基づき、言語仕様は段階的に明確化される。

リテラル仕様は以下の理由から早期に確定する必要がある。

  • Lexer / Parser / Binder の基盤となる
  • 型推論および型検査の前提となる
  • 定数畳み込みや IR 生成に影響する
  • エラーメッセージ品質に直結する

また、設計上の要求は以下の通りである。

  • Rust 風の読みやすい数値リテラルを採用する
  • ただし Rust 互換ではなく Sobakasu 独自仕様とする
  • Udon / Unity の特性上、既定の数値型は f32 とする
  • 実装簡素化のため、当面は 32 ビット型に限定する
  • 配列・文字列・真偽値・null・void 相当を明確に定義する
  • 型命名の一貫性を保つ

Sobakasu は以下の組み込みリテラル型を定義する。

  • i32
  • u32
  • f32
  • string
  • []
  • bool
  • null
  • ()

また、リテラル構文を以下のように定義する。

整数リテラルは i32 または u32 を表す。

  • 10進数: 42, 1_000
  • 2進数: 0b1010
  • 8進数: 0o755
  • 16進数: 0xFF
123i32
123u32
0xFFu32
  • サフィックスなし整数は i32

  • - は単項演算子として扱う(リテラルではない)

  • _ は桁区切りとして使用可能

  • 以下は禁止

    • 0x_FF
    • 123_
    • 123_i32
  • 範囲外はコンパイルエラー

  • -1u32 は型エラー

浮動小数点リテラルは f32。

3.14
0.5
1_000.25
1e3
1.5e2
2.5e-4
3.0E+2
  • 小数点または指数を含む場合 f32
  • 10f32 のような明示指定も可能
  • _ 使用可能(ただし区切りルールあり)
  • 無効な位置での _ はエラー
  • f32 に変換できない値はエラー
"hello"
"Hello, world!"
"こんにちは"
  • " で囲む

  • 改行は未対応

  • エスケープ:

    • \"
    • \\
    • \n
    • \r
    • \t
  • 未終端はエラー

[]
[1, 2, 3]
["a", "b"]
[true, false]
  • [expr, ...]
  • 要素型は単一
  • 空配列は型推論できない場合エラー
  • 多次元配列は未対応
true
false
  • 予約語
  • 型は bool
null
  • 参照的値の欠如を表す

  • 使用可能:

    • string
    • 配列
    • 将来の参照型
  • 使用不可:

    • i32
    • u32
    • f32
    • bool
    • ()

Sobakasu は void の代わりに () を採用する。

  • () は値を返さない処理の型
  • 命名は i32 / u32 / f32 との一貫性のため
  • 整数型ではない
  • 数値演算不可
  • 変換不可
func hello(): () {
Debug.Log("Hello")
}
  • int, uint, float, void

問題:

  • 型幅が不明確
  • Udon 向け設計と不一致

問題:

  • Udon / Unity と相性が悪い
  • f32 を既定にしにくい

問題:

  • 型命名の一貫性が崩れる

問題:

  • 意味論が破綻する
  • 利用者に誤解を与える
  • 型幅明示(i32, u32, f32)は Udon と相性が良い
  • f32 を既定とすることで Unity 実用性が高い
  • Rust 風リテラルは可読性が高い
  • u32 によりビット操作・16進数と親和性が高い
  • 指数表記により数値表現の実用性が向上
  • () により型体系の一貫性を維持できる
  • 一貫した型命名
  • 実装の単純化(32bit限定)
  • 高い可読性
  • Udon/Unity最適化
  • 学習コスト(C# と異なる)
  • 型推論ルールの追加設計が必要
  • () の理解コスト

本 ADR は以下を定義する。

  • リテラル構文
  • 型との対応
  • 既定数値型
  • () の採用

以下は未確定。

  • 暗黙型変換
  • 配列内部表現
  • null 許容ルール詳細
  • IR / UASM への lowering