Refocus manual on public language usage

This commit is contained in:
2026-08-14 08:17:25 +09:00
parent e0a9a8efb7
commit e0970acdcc
41 changed files with 611 additions and 1982 deletions
+11 -29
View File
@@ -1,6 +1,6 @@
# 関数
関数は構造を受け取り、構造を返す式として扱う
関数はを受け取り、を返す純粋な式である
## 構文
@@ -17,7 +17,7 @@ in
increment(41)
```
複数引数も指定できる。
複数の parameter を指定できる。
```dcdl
(input_a: { hoge = Int & >= 0; }, input_b: { fuga = Int; }) =>
@@ -27,33 +27,15 @@ in
}
```
## 関数の意味
parameter range は省略できる。
range がある場合、引数は参照された時点で `as` と同じ規則によって検証・絞り込みされる。
関数は runtime value として扱えるが、最終データとして materialize することはできない。
未適用の関数値が materialize 対象に残っている場合は diagnostic になる。
## Scope and evaluation
関数opaque であり、関数値同士の等価性は提供しない
`&` で関数値同士を合成すると conflict になる
関数は lexical scope を持ち、定義された場所の bindings を参照する
引数は遅延評価され、関数本体から参照されない引数は評価されない
再帰的な field または argument の依存は cycle diagnostic になる。
## 評価方針
関数は以下の方針で評価する。
- 関数は純粋である。
- 関数はレキシカルスコープを持つ。
- 関数は定義時の環境を参照として保持する。
- 引数は thunk として渡され、必要になるまで評価されない。
- parameter range がある引数は、force 時に `as` と同じ範囲包含・絞り込み規則で合成される。
- 関数呼び出し結果そのものはグローバルには memoize しない。
- フィールドに束縛された関数呼び出し結果は、そのフィールド thunk の評価結果として memoize される。
- 再帰的な依存は thunk cycle として diagnostic になる。
関数値の内部モデル例:
```text
Function {
params: Vec<Param>
body: ExprId
env: EnvRef
}
```
関数は中間値として参照・呼び出しできるが、data として materialize できない。
未適用の関数が materialize 対象に残っている場合は diagnostic になる。
関数値同士の等価性は定義されず、`&` で関数値同士を合成すると conflict になる。