This commit is contained in:
2026-06-16 00:45:10 +09:00
commit 5d6a03b74f
32 changed files with 1443 additions and 0 deletions
@@ -0,0 +1,15 @@
# Array Expression
array expression は、順序付きの値の列を表す。
```n
[1, 2, 3]
["a", "b", "c"]
```
## 未確定事項
- 配列要素の制約表現。
- 異種配列を許可するか。
- `//` による patch を右辺置換だけにするか。
- append / prepend / remove などの操作を提供するか。
@@ -0,0 +1,24 @@
# Composition Expression
composition expression は、複数の値・制約・構造を合成する式である。
## `&`
`&` は制約を保った合成を行う。
```n
Port = Int & >= 1 & <= 65535;
Config = MyConfig & { port = 8000; };
```
## `//`
`//` は右辺優先の構造的 patch を行う。
```n
Patched = Base // {
feature_hoge.enable = false;
};
```
詳細は [合成演算子](../operators.md) に置く。
@@ -0,0 +1,15 @@
# Default Expression
`default` expression は、明示値が存在しない場合に materialize 時に採用される fallback を指定する。
```n
port = Int default 8080;
```
`default` は制約ではない。
詳細は [制約と default](../constraints-and-defaults.md) に置く。
## 評価
fallback 値は thunk として保持できる。
明示値がある場合、default は採用されない。
@@ -0,0 +1,17 @@
# Function Call Expression
function call expression は、関数値を引数に適用する式である。
```n
mk_hw({
greet = "Hello";
target = "World";
})
```
## 評価
引数は thunk として渡せる。
関数本体内で引数が参照されたときに評価する。
任意の関数呼び出し結果をグローバルに memoize することは必須ではない。
@@ -0,0 +1,18 @@
# Function Expression
function expression は、引数を受け取り式を返す値である。
```n
(part: {
greet = String;
target = String;
}) =>
"${part.greet}! ${part.target}"
```
関数仕様の詳細は [関数](../functions.md) に置く。
## 評価
関数は定義時の環境を参照として保持する。
関数本体は、関数値の生成時ではなく呼び出し時に評価される。
@@ -0,0 +1,14 @@
# Identifier Expression
identifier expression は、現在の環境に束縛された名前を参照する式である。
```n
Port
MyConfig
mkConfig
```
## 評価
識別子は、対応する束縛の thunk を参照する。
束縛が存在しない場合は未定義識別子エラーになる。
@@ -0,0 +1,15 @@
# Import Expression
import expression は、外部ファイルを読み込み、そのファイルの評価結果を返す。
```n
import ./config.n
import "./config.n"
```
import 仕様の詳細は [モジュールと import](../modules-and-imports.md) に置く。
## 評価
import 先はモジュール単位で読み込まれる。
ただし、各 field は thunk として保持され、必要になるまで評価されない。
@@ -0,0 +1,24 @@
# Expression
この章では、言語が評価対象として持つ式の分類を定義する。
式は、値・制約・構造・計算を表す基本単位である。
```text
Expr
├─ literal
├─ identifier
├─ path reference
├─ object
├─ array
├─ function
├─ function call
├─ let
├─ match
├─ import
├─ composition
├─ default
└─ string interpolation
```
各式の個別仕様へのリンクは [Manual Index](../../index.md) に集約する。
@@ -0,0 +1,18 @@
# Let Expression
let expression は、ローカル束縛を作る。
```n
let
part = {
greet = "Hello";
target = "World";
};
in
"${part.greet}! ${part.target}"
```
## 評価
let 束縛は thunk として保持される。
参照されない束縛は評価されない。
@@ -0,0 +1,20 @@
# Literal Expression
literal expression は、ソース上に直接書かれる具体値である。
## 種類
```n
"hello"
123
3.14
true
false
```
## 対応する primitive type
- 文字列リテラルは `String` を満たす。
- 整数リテラルは `Int` を満たす。
- 浮動小数リテラルは `Float` を満たす。
- `true` / `false``Bool` を満たす。
@@ -0,0 +1,24 @@
# Match Expression
match expression は、対象値を上から順に pattern と照合し、最初に一致した分岐を採用する。
```n
foo = match inputs.a.hoge {
>= 20: {
value = 200;
};
>= 10: {
value = 100;
};
_: {
value = 300;
};
};
```
`_` は fallback pattern である。
## 順序
分岐は順序付きであり、「最も具体的な pattern」を自動選択しない。
広い条件を先に書くと、後続の狭い条件には到達しない。
@@ -0,0 +1,39 @@
# Object Expression
object expression は、名前付き field の集合を表す。
```n
{
host = "127.0.0.1";
port = 8000;
}
```
object は設定値にもスキーマにも使う。
```n
MyConfig = {
host = String;
port = Int default 8080;
};
```
## Dot-path Field
ネストした field はドットパスでも定義できる。
```n
{
feature_hoge.enable = false;
}
```
これは以下と同じ構造を表す。
```n
{
feature_hoge = {
enable = false;
};
}
```
@@ -0,0 +1,15 @@
# Path Reference Expression
path reference expression は、object のフィールドを参照する式である。
```n
config.host
config.feature_hoge.enable
```
## 評価
左側の式を object として評価し、指定された field を参照する。
参照先 field は必要になるまで評価されない。
存在しない field への参照をエラーにするか、open schema として扱うかは未確定である。
@@ -0,0 +1,12 @@
# String Interpolation Expression
string interpolation は、文字列内に式を埋め込む候補機能である。
```n
"${part.greet}! ${part.target}"
```
## 評価
補間式の評価タイミングは通常の遅延評価に従う。
文字列補間を初期実装に含めるかは未確定である。