Update spec.md
This commit is contained in:
39
spec.md
39
spec.md
@@ -21,6 +21,29 @@ One of:
|
|||||||
- `'Case1 t1 | 'Case2 t2 | ...?Identifier`: partial tagged union type, `Identifier`
|
- `'Case1 t1 | 'Case2 t2 | ...?Identifier`: partial tagged union type, `Identifier`
|
||||||
- `{field1: xt, field2: yt, ...?Identifier}`: partial non-nominal record type, `Identifier`
|
- `{field1: xt, field2: yt, ...?Identifier}`: partial non-nominal record type, `Identifier`
|
||||||
|
|
||||||
|
|
||||||
|
## Generic types
|
||||||
|
Means that the structure of that value is not available at compile time.
|
||||||
|
This implies that you can dispatch on those values.
|
||||||
|
This means that you can not write a magic `List.toString` function, because you would have to dispatch on `toString`,
|
||||||
|
so you have to do something like this:
|
||||||
|
```
|
||||||
|
def List.toString =
|
||||||
|
toStr: (t -> Char List) ->
|
||||||
|
list: t List ->
|
||||||
|
...
|
||||||
|
```
|
||||||
|
This is also the case for equality, and `List.contains`:
|
||||||
|
```
|
||||||
|
def List.any =
|
||||||
|
fn: (t -> Bool) ->
|
||||||
|
list: t List ->
|
||||||
|
...
|
||||||
|
|
||||||
|
List.any(x -> x = y, list)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
## Recursive types
|
## Recursive types
|
||||||
Recursive / self-referential types
|
Recursive / self-referential types
|
||||||
|
|
||||||
@@ -68,9 +91,6 @@ type Uint8 = {...?Uint8}
|
|||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
|
||||||
## Syntax
|
|
||||||
TODO ebnf
|
|
||||||
|
|
||||||
|
|
||||||
## Compatible-with
|
## Compatible-with
|
||||||
Check if type is compatible-with / assignable-to type requirements.
|
Check if type is compatible-with / assignable-to type requirements.
|
||||||
@@ -390,6 +410,19 @@ Give fuzzy-matched suggestions for at the following things:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Syntax
|
||||||
|
Note that the order of syntax cases matter!
|
||||||
|
```
|
||||||
|
Identifier = { (* ( a-z | A-Z | 0-9 | _ | - | . | # ) TODO: cvt to ebnf *) };
|
||||||
|
Partial Type = '?', Identifier;
|
||||||
|
Union Type Case = '\'', Identifier, [ Type (*default to Unit*) ];
|
||||||
|
Union Type = Union Type Case, { '|', Union Type Case};
|
||||||
|
Record Type Field = Identifier, ':', Type;
|
||||||
|
Record Type = '{', [Record Type Field, {',' Record Type Field }], [ '...', Partial Type ], '}';
|
||||||
|
Type = Partial Type | Identifier | Union Type | Record Type | TODO;
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
# OLD SPECIFICATION STARTING HERE
|
# OLD SPECIFICATION STARTING HERE
|
||||||
## automatic return types
|
## automatic return types
|
||||||
```
|
```
|
||||||
|
Reference in New Issue
Block a user