NEPLg2.0 → NEPLg2.1 構文変更対照表


1. 前提

この文書では、NEPLg2.1 のうち Zenn #1「カリー化」と Zenn #2「型と制御構文」で明示された内容を正として、NEPLg2.0 との差分を整理する。


2. 宣言構文

構文NEPLg2.0(旧)NEPLg2.1(新)
関数定義fn name <TypeParams> <Sig> (params):let name <expr>
lambda(a, b): body\a \b body
0 引数関数fn main <()->i32> ():let main \() 0
struct 定義struct Name<.T>:let Name struct .T:
enum 定義enum Name<.T>:let Name enum .T:
trait 定義trait Name:let Name trait:
impl 定義impl Trait for Type:let Type impl for Trait:

// NEPLg2.0
fn id <.T> <(.T)->.T> (x):
    x
// NEPLg2.1
let id \x x

3. 型記法

箇所NEPLg2.0(旧)NEPLg2.1(新)
型適用Name<A, B>Name A B
型パラメータ宣言<.T, .U>.T .U
1 引数関数型A -> Bfn A B
2 引数関数型(A, B) -> Cfn A fn B C
1 引数 Impure 関数型A *> Bfn* A B
unit 型 / 値()()
型注釈<TypeExpr>%TypeExpr <expr>

NEPLg2.0NEPLg2.1
Vec<i32>Vec i32
Result<i32, str>Result i32 str
(i32) -> i32fn i32 i32
(i32, i32) -> i32fn i32 fn i32 i32
() -> i32fn () i32

4. % の意味

これは旧 2.1 案からも変わった点である。

旧案Zenn #1 / #2 を正とした 2.1
宣言で型注釈を始める記号続く 1 個の式に作用する前置演算子
%i32 add 1 2
add %i32 1 2

5. 関数と部分適用

項目NEPLg2.0NEPLg2.1
関数の内部モデル通常の多引数関数カリー化
部分適用実質的に使える場面がある不採用
add 1

NEPLg2.1 ではこれは値ではなくエラーとして扱う。


6. 制御構文

構文NEPLg2.0(旧)NEPLg2.1(新)
ifif cond then a else bif cond a b または if cond then a else b
match armpattern: suitepattern expr
block暗黙 block が中心block: を明示
中間式の破棄文区切り中心前置 ; expr

if true 1 2
if true then 1 else 2

match x:
    or 1 2 println "one or two"
    _ println "other"

block:
    ; println "side effect"
    1

7. pattern

項目旧案Zenn #2 を正とした 2.1
ORguard 側に寄せるor pattern
range保留span pattern
struct 分解位置ベースfield 名付き
match c:
    span 'a' 'j' println "early"
    _ println "other"

let Point x: a y: b p

8. 旧比較文書からの読み替え

この比較ディレクトリの旧文書では、fn A B -> Cunit\ a b :if <cond> : <suite> など、Zenn #1 / #2 確定前の 2.1 案を新仕様として記していた。現在はそれらを採用しない。

参照先:

On this page