summaryrefslogtreecommitdiff
path: root/docs/type_system/function.md
blob: ebd14eafe3f3e2836eb77602e97bd8467d27bb52 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# Function

---

```text
Function_class `alias Enum[
    .unknown; .incomplete; .native
    .task; process; .generator; .iterator; .closure;
    .bound;
    .regex
]

Function[Function_class; RETURN_TYPE; Collection[TYPE.SYMBOL]; STATE; List]
```

# Alias

```text
Fn[Generic.T; Collection[TYPE.SYMBOL]] `alias Function[Any; Generic.T; Collection[TYPE.SYMBOL]; STATE; List]
```

# Inline Definition

```text
([x; y] x + y) // Fn[Any; Any.x; Any.y]
([I64.x; y] x + y) // Fn[Any; I64.x; Any.y]
```

# Function Classes

## Unknown

Placeholder before evaluation

## Incomplete

A function with an incomplete type, type checking occurs at invocation

## Native

Native function wrapper

## Task

A queue-able function in a process or iterator

## Process

A list of tasks with state

## Generator

A function for creating an iterator

## Iterator

A task creator with state, cannot take arguments, can be called until done

## Closure

A task creator with state that can take arguments

## Bound

A function with some arguments already set

## Regex

Regular Expression

# Returning

## \`return

## Transient Union Return Chaining

# Iterating

## \`yield

Yielding wraps the value in the transient union `Next`

Return `Void` to stop iteration

```text
fn : ([n] @ 1 < n {[x] `yield 2 * x; n +: 1 } )
it : fn `sync 10
// invoking
@ it {[v] `log v } // 2 4 6 8 10 12 14 16 18 20
// same as above
@ {
    # `sync it {
        .value {[v] `log v }
        .done { `break }
    }
}
```

# Calling

## \`async

Asynchronous call

```text
task : `async fn
value : `await task
```

## \`sync

Synchronous call

If the callee is a process, an inline await with async is used

```text
fn `sync args // can be turned into `await fn `async args
```