本文へ移動
mie リファレンス
REPL Playground

構文リファレンス

リテラル・演算子・束縛・ブロックなど、mie の構文要素ごとの形式と実行例を列挙する。

enum 定義 @enum

@enum Name := OneOf(Tag1(T...), Tag2(T...), ...)

タグ付きデータ型を宣言する。各タグは Name.Tag (型値の下の slot) として住み、フラット束縛はしない。複数タグは OneOf(...) でまとめる。

>>> @enum Shape := OneOf(Circle(Float), Rect(Float, Float))
>>> Shape.Circle(2.0) matches Shape
true

タプル (a, b)

(a, b, ...)

2 要素以上の不変・固定長タプル。複数引数の適用・多値返却・分解代入に使う。

>>> (1, 2).length()
2

ファイルヘッダ #{mie} / #[mie]

#{mie} / #[mie] / #{mie strict} / #[mie strict]

ファイル先頭の最初の有意行 (shebang を除く) で mode ({}=実行スクリプト、[]=ライブラリ) と属性 (strict のみ) を宣言する。#{mie} は省略可 (省略時と同義)、#[mie] は省略不可。

ブロック/関数/オブジェクト統一リテラル { slot-list | body }

{ slot-list | body }

関数・ブロック・データオブジェクトはすべて同じリテラルで作る。body があれば呼び出しで body を評価し (関数)、body が空なら呼び出しで自身を返す (データ)。

>>> {x | x + 1}(2)
3
>>> {x := 1, y := 2 |}
{ x=1, y=2 |}

メソッド呼び出し x.f / x.f(a)

recv.method(args)

ドットでレシーバのスロット/型メソッドを取り出し、並置または括弧で引数を渡す中置糖衣。

>>> [1, 2, 3].length()
3
>>> 5.to_float()
Some(5.0)

モジュール取り込み @import "path.mie"

@import "path.mie"

ファイル / std: 標準ライブラリ / pkg: 依存を取り込み、名前空間オブジェクトを返す。引数は文字列リテラル 1 個のみ (動的パス・変数・補間は構文エラー)。プレフィックス無しは呼び出し元ファイル基準の相対パス、std:name は標準ライブラリ、pkg:alias はマニフェスト経由の依存解決。
import は呼び出し元ファイルの実体パスに依存するため、本リファレンス生成の評価環境 (ファイルを持たない孤立式) では実行できない。以下は構文のみ検証する例。

>>> m := @import "std:math"
>>> print m.sqrt(4.0)

中置二項演算子 + - * / %

a op b

算術演算はレシーバのスロット呼び出しへの中置糖衣。優先順位は乗除 > 加減。

>>> 1 + 2 * 3
7

分岐 dispatch @match

@match subject { pattern [| guard] => body … }

subject を各 arm のパターンに構造照合し、最初に一致した arm の body を返す。
subject を省くと arm 頭が述語 (Bool 式) の短絡連鎖になる。

>>> @match 2 { 1 => "a"; 2 => "b"; _ => "c" }
"b"

分配束縛 a, b := expr / [name, ...] := value

a, b := expr / [name1, name2] := value

タプルから位置ごとに複数ローカルを一括束縛する (位置 destructure)、またはオブジェクトから同名スロットを一括束縛する (名前 destructure)。

>>> a, b := (1, 2)
>>> a + b
3
>>> [x, y] := {x := 1, y := 2 |}
>>> x + y
3

前置演算子 -

-x

単項マイナスのみが前置演算子として存在する (論理否定に前置 ! は無く、.not() を使う)。

>>> x := 5
>>> -x
-5

動的添字アクセス x.[i]

recv.[expr]

[] 内の式を評価した値でスロットを動的に引く (String なら名前軸、Integer なら位置軸)。

>>> [10, 20, 30].[1]
20

型アスクリプション expr: Type

expr: Type

任意の式に型を後置表明し、評価地点で照合する。: は最低優先 (二項演算子・関数適用より弱く非結合)。

>>> 1 + 2: Int
3

型定義 @type

@type Name := <型式>

型式を値化して名前に束縛する。以後その名前を matches / 型注釈 / match の型パターンで使える。

>>> @type Meters := Int
>>> 5: Meters
5

失敗伝播 expr?

expr?

Result/Option の失敗 variant なら関数から即座に脱出し (Result はそのまま返す)、成功 variant なら中身を取り出す。return の構文糖。

>>> f := {r | r?}
>>> f(Ok(5))
5
>>> g := {r | r?}
>>> g(Err({kind := "boom", message := "x" |}))
Err({ kind="boom", message="x" |})

整数リテラル 42

42

10進のほか 0x (16進) / 0b (2進) / 0o (8進) prefix、桁区切り _ を書ける。

>>> 42
42

文字列リテラル "..."

"text"

ダブルクォートのみ。要素は Unicode code point (rune) 単位。

>>> "hi"
"hi"

文字列補間 ${...}

"text${expr}text"

文字列リテラル中の ${expr} を評価し、文字列化して埋め込む。

>>> name := "mie"
>>> "hello, ${name}"
"hello, mie"

明示的 kick 後置 !

f!

引数無し呼び出し f!f() の短縮。全名前スロットが埋まらない値適用は部分適用になるが、明示的 kick (() / !) だけが残りのスロットへデフォルト値を補完して本体評価に進む。

>>> v := {x := 0, y := 0 | x + y}
>>> v!
0

束縛 :=

name := expr

名前に値を immutable に束縛する新規ローカル宣言。同じスコープでの再宣言はエラー (シャドウ不可)。

>>> x := 2
>>> x + 1
3

比較・論理演算子 == != < <= > >= && ||

a == b / a && b

比較は Ordering 経由の全順序、&&/|| は Bool 専用の短絡評価 (糖衣に脱糖しない)。

>>> 1 < 2
true
>>> true && false
false

浮動小数リテラル 3.14

3.14

小数点の両側に数字が必要 (3..5 は Float にならない)。指数表記 1e10 も Float。

>>> 3.14
3.14

真偽値リテラル true / false

true / false

Bool の 2 値。制御構造・&&/|| の被演算子は Bool 専用 (§9.3 厳格判定)。

>>> true
true

複数行文字列 """..."""

"""..."""

""" で開き """ で閉じる複数行文字列。開き """ の直後は改行必須、閉じ """ は行頭空白のみの独立行に置く。閉じ行のインデントを共通接頭辞として各行から剥がす (dedent)。本文中の単独の " はエスケープ不要。エスケープ (\n \t ほか) と ${...} 補間は通常の文字列と同じ。

>>> """
>>> a "quoted" line
>>> """
"a \"quoted\" line"