NEPLg2.1 言語概要

最終更新: 2026-03-27


本ディレクトリでは、2026-03-25 公開の Zenn #1「カリー化」と 2026-03-27 公開の Zenn #2「型と制御構文」で明示された内容を、現時点のコア構文の正とする。

1. 言語の三本柱

NEPLg2.1 は次の三つを同時に満たす言語基盤を目指す。

  1. どこでも動く

一つのプログラムを書けば、WebAssembly・WASI・ネイティブバイナリのいずれでも同じ安全意味論で動くことを目指す。

  1. 安全である

型安全・メモリ安全・所有権規則・効果分離をコンパイル時に検査する。

  1. 高速である

GC に依存せず、静的解析と自動メモリ管理によって予測可能な実行を目指す。


2. コア構文の原則

2.1 完全前置記法

関数適用は常に前置で書く。

add 1 2
mul add 1 2 3

式境界は、括弧ではなく型情報とカリー化された関数型で決まる。

2.2 カリー化

Zenn #1 を基準として、関数は 1 引数関数の連鎖として扱う。

  • add のような 2 引数関数は、型としては i32 -> i32 -> i32
  • NEPLg2.1 の型記法では fn i32 fn i32 i32
  • 0 引数関数は () を唯一の引数として受け取る

2.3 部分適用はサポートしない

関数はカリー化して定義するが、評価結果として関数型が残る式はエラーとする。

add 1

これは「引数不足」として不正である。

2.4 型も前置記法

型も式と同じく括弧なし前置記法で書く。

Pair i32 bool
fn i32 fn i32 i32
Result i32 str

2.5 % は式に掛かる型注釈

% は宣言専用の記号ではなく、続く 1 個の式に作用する前置演算子である。

%i32 add 1 2
add %i32 1 2

2.6 let は「名前に式を束縛する」

定義の基本形は let <name> <expr> である。関数定義も特別扱いせず、lambda 式を束縛する。

let zero 0
let double \a add a a
let mut counter 0

2.7 制御構文も前置記法

Zenn #2 で現時点のコアとして確定している制御構文は ifmatchblock:、前置 ; である。

if true 1 2
if true then 1 else 2

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

block:
    ; expr1
    expr2

3. 値と型の表記

3.1 unit

unit 型の値表記は () とする。旧案の unit 値表記は採用しない。

3.2 型変数

型変数は .T.S のように書く。

3.3 関数型

関数型 .T -> .Sfn .T .S と書く。2 引数以上はカリー化した関数型を入れ子にする。

fn i32 i32
fn i32 fn i32 i32

4. 現時点の基本構文

4.1 lambda

lambda は \arg <expr> を基本形とする。0 引数は \() を使う。複数引数関数は lambda を入れ子にする。

\a add a a
\a \b add a b
\() 0

複数行本体はオフサイドルールを使って書く。

let main \():
    let p Point x: 0 y: 7
    let Point x: a y: b p

4.2 if

if は 3 つの式を取る前置式である。

if <cond_expr> <then_expr> <else_expr>
if <cond_expr> then <then_expr> else <else_expr>

4.3 match

matchmatch <expr>: の下に、<pattern> <expr> の arm をインデントで並べる。

4.4 block と ;

block: は複数の式を一つの式にまとめる。途中の式を捨てたいときは ; <expr> を使う。;<expr> は「その式を評価して () にする」前置演算子として扱う。


5. 他仕様との関係

本ディレクトリには、所有権・副作用・trait・Phase 8 など、Zenn #1 / #2 より先の設計も含まれている。そうした文書では、今回確定したコア構文と矛盾しないよう表記を更新し、Zenn 記事で未確定の領域は将来設計として扱う。

On this page