構文リファレンス
リテラル・演算子・束縛・ブロックなど、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"