Skip to content

Rework struct initializers #36

@Victorious3

Description

@Victorious3

To avoid some ambiguity in the grammar and being able to use {} for blocks only, it's probably a good idea to change struct initializers to use the [] syntax.

The type of [] would depend on the elements provided.

Element Kind Resulting type
1 [] empty tuple ()
2 [1, 2, 3] static array [3; int]
3 [1, 2.0, 3] tuple (int, double, int)
4 [b = 20] structure struct { b: int }
5 [1, 2, b = 20] initializer Initializer([2; int], struct { b: int })
6 [1, 1.5, b = 20] initializer (jagged) Initializer((int, double), struct { b: int })
7 [(1) = 20, (2) = 30] initializer map InitializerMap([2; int], [2; int])
8 [(1) = 20, (1.5) = 2.5] initializer map (jagged) InitializerMap((int, double), (int, double))

Coercion table

1 2 3 4 5 6 7 8
1 x x x x x x x x
2 x x
3 x
4 x x x
5 x x
6 x
7 x x
8 x

Struct initialization could be done using 1-6. Array initialization could be done with 1-3.

// Typed map
def make_map(type K, type V) -> Map(K, V)
def make_map(init: InitializerMap([type K], [type V])) -> Map(K, V)

// Untyped table
def make_table(init: Initializer(type K, type V)) -> Table
def make_table(init: InitializerMap(type K, type V)) -> Table

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions