基礎: 代数的オブジェクト指向

本ページは daitai-lang の概念的基礎です。規範文法は v1.4 仕様 を、憲法は 原則 を参照してください。

立場

daitai-lang は小さく退屈な代数的オブジェクト指向言語です。それはアルゴリズムを明晰かつ決定論的に仕様化するために存在します — 表現力の最大化のためでも、ベンチマークの勝利のためでも、利便性のためでもありません。明晰さ、決定性、正しさは、他のあらゆる性質より厳密に重要です。

daitai-langであるもの

  • 決定論的
  • 静的型付け
  • 既定で不変
  • 式ベース
  • バックエンド中立

daitai-langでないもの

  • ランタイム
  • 例外ベース
  • 継承による多態
  • 状態を持つ
  • ホスト言語に依存

daitai-lang はアルゴリズムがであるかを記述します。どう走るかは決して記述しません。

代数的 OO を一段落で

オブジェクトは結びついた変換を持つ代数的データ型です。クラスは積(フィールドのレコード)。インターフェースは和(閉じた形の集合)。メソッドはレシーバ付きの純粋関数。ライフサイクルも副作用もありません。挙動を伴う継承、仮想ディスパッチ、変更、例外、大域状態、IO、リフレクション、マクロは、コアではすべて禁じられています。

許される四つの最上位宣言

最上位に現れてよい構造は四つだけです:

  • class — 積型(不変レコード + 純粋メソッド + 静的ファクトリ)
  • interface — 和型(閉じた形。フィールドなし、メソッド本体なし、名義型のみ)
  • enum — 名前付き値の離散集合
  • function — 純粋な最上位変換

それ以外は却下されます。

クラスの意味論

class Vec3:
    x: Float
    y: Float
    z: Float

    method add(other: Vec3) -> Vec3:
        return Vec3(
            x = this.x + other.x,
            y = this.y + other.y,
            z = this.z + other.z
        )

    static method zero() -> Vec3:
        return Vec3(x=0, y=0, z=0)

規則:

  • すべてのフィールドは val。構築時に一度だけ代入され、決して変更されない
  • 等価性は構造的であり、参照的ではない
  • オブジェクトの同一性は存在しない
  • コンストラクタにロジックは含まれない
  • メソッドは純粋。this は読み取り専用
  • 静的メソッドはファクトリ

形としてのインターフェース

interface Curve

class Line implements Curve:
    start: Vec3
    end: Vec3

class Arc implements Curve:
    center: Vec3
    radius: Float

インターフェースはフィールドもメソッド本体も持ちません — 既定実装すらも。閉じた族に名前を与えるだけです。ディスパッチは仮想表ではなく match で行います。

失敗は値である

例外はありません。失敗しうる演算は Result<T, E> を返し、不在は Optional<T> です。コアに null は存在しません。

function parseInt(s: String) -> Result<Int, ParseError>

enum ParseError:
    InvalidFormat
    Overflow

禁止リスト

以下の構造は daitai-lang フロントエンドが却下します。様式上の好みではなく、文法から取り除かれています。

  • 変更と変数の再代入
  • 挙動を伴う継承
  • 仮想ディスパッチ / 多態的メソッド本体
  • 例外と try / catch
  • 宣言境界を越える暗黙の型付け
  • null
  • 大域状態
  • IO、ロギング、環境アクセス
  • リフレクションとメタプログラミング
  • ターゲット言語固有の構造

仕様で明示的に許可されていない構造は禁止です。疑わしいときは、アルゴリズム自体を単純化してこの枠に収めてください。

次に読むもの