42 lines
1.2 KiB
Markdown
42 lines
1.2 KiB
Markdown
# 関数
|
|
|
|
関数は値を受け取り、値を返す純粋な式である。
|
|
|
|
## 構文
|
|
|
|
```dcdl
|
|
(value: Int) => value + 1
|
|
```
|
|
|
|
関数呼び出しは通常の呼び出し構文で行う。
|
|
|
|
```dcdl
|
|
let
|
|
increment = (value: Int) => value + 1;
|
|
in
|
|
increment(41)
|
|
```
|
|
|
|
複数の parameter を指定できる。
|
|
|
|
```dcdl
|
|
(input_a: { hoge = Int & >= 0; }, input_b: { fuga = Int; }) =>
|
|
{
|
|
hoge = input_a.hoge;
|
|
fuga = input_b.fuga;
|
|
}
|
|
```
|
|
|
|
parameter range は省略できる。
|
|
range がある場合、引数は参照された時点で `as` と同じ規則によって検証・絞り込みされる。
|
|
|
|
## Scope and evaluation
|
|
|
|
関数は lexical scope を持ち、定義された場所の bindings を参照する。
|
|
引数は遅延評価され、関数本体から参照されない引数は評価されない。
|
|
再帰的な field または argument の依存は cycle diagnostic になる。
|
|
|
|
関数は中間値として参照・呼び出しできるが、data として materialize できない。
|
|
未適用の関数が materialize 対象に残っている場合は diagnostic になる。
|
|
関数値同士の等価性は定義されず、`&` で関数値同士を合成すると conflict になる。
|