NEPLg2.1 パターン・Match・Let 仕様
最終更新: 2026-03-27
1. 方針
Zenn #2 を基準とし、match arm と let 分解は Rust 風の発想を前置記法へ写したものとして定義する。
2. パターンの種類
2.1 識別子パターン
let x 42
2.2 ワイルドカード
let _ expr
2.3 リテラルパターン
match n:
0 println "zero"
_ println "other"
2.4 OR パターン
Zenn #2 に従い、or は guard ではなく pattern 自体として扱う。
match x:
or 1 2 println "one or two"
_ println "other"
2.5 span パターン
range pattern は保留ではなく、span を用いた pattern として扱う。
match c:
span 'a' 'j' println "early ASCII letter"
span 'k' 'z' println "late ASCII letter"
_ println "other"
2.6 struct field pattern
struct 分解は位置ベースではなく field 名付きで書く。
let Point x: a y: b pmatch p:
Point x: a y: b println a3. let による分解
let は単純束縛だけでなく分解にも使える。
let Point x: a y: b pこのとき Point は struct pattern、x: と y: は対象 field 名、a と b は新しい束縛である。
型注釈が必要なら、右辺側の式に %TypeExpr を前置する。
let Point x: a y: b %Point p_expr4. match
4.1 構文
match <expr>:
<pattern> <expr>
<pattern> <expr>arm は :<suite> ではなく <pattern> <expr> である。
4.2 例
match x:
or 1 2 println "one or two"
3 println "three"
_ println "anything"match c:
span 'a' 'j' println "early ASCII letter"
span 'k' 'z' println "late ASCII letter"
_ println "something else"
4.3 網羅性
Zenn #2 に従い、_ を書いた時点で網羅される。網羅されていない match はエラーとする。
5. guard について
旧案にあった pattern if pred: expr をコア構文とはしない。Zenn #2 では or や span を pattern として直接導入しているため、少なくとも現時点の基準文書では guard を中心に説明しない。
guard やより複雑な pattern 合成は将来拡張候補として別途検討する。
6. enum / constructor pattern
Zenn #2 は主に or、span、struct field pattern を明示している。enum variant pattern 自体は従来どおり利用できるものとして扱うが、詳細な bare variant 解決規則は declarations.md に従う。
match opt:
Option::Some v v
Option::None 07. 所有権との関係
pattern による分解が move か borrow かは、対象型の所有権規則に従う。ここで重要なのは表層構文であり、構文自体は field 名付き前置記法に統一する。
8. 旧案からの変更点
- OR は guard ではなく
orpattern - range は保留ではなく
span - match arm は
pattern: suiteではなくpattern expr - struct 分解は位置ベースではなく field 名付き
- 部分適用を前提にした guard 記述は採用しない