Skip to content

Commit fa36251

Browse files
Merge pull request #1550 from andrew-johnson-4/type2-codegen-constructors
Type2 codegen constructors
2 parents c458e27 + 303542e commit fa36251

File tree

6 files changed

+32702
-32229
lines changed

6 files changed

+32702
-32229
lines changed

BOOTSTRAP/cli.c

Lines changed: 32647 additions & 32228 deletions
Large diffs are not rendered by default.

PLATFORM/C/LIB/primitives.lsts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,15 @@ declare-binop( $"primitive::field-set", raw-type(base-type), raw-type(field-type
2121

2222
declare-unop( $"primitive::field-get-indirect", raw-type(base-type[]), raw-type(field-type), ( l"("; x; l"->"; mangle(field-name :: L); l")"; ) );
2323
declare-binop( $"primitive::field-set-indirect", raw-type(base-type[]), raw-type(field-type), raw-type(Nil), ( l"("; x; l"->"; mangle(field-name :: L); l"="; y; l")"; ) );
24+
25+
declare-unop( $"primitive::constructor", raw-type(arg-types), raw-type(return-type), (
26+
l"{"; mangle-pre(return-type); l" "; uuid(return); mangle-post(return-type); l";";
27+
if case-tag :: L {
28+
uuid(return); l".discriminator_case_tag="; discriminator-case-tag :: L; l";";
29+
};
30+
for Tuple{field-name=first, field-type=second} in arguments {
31+
uuid(return); l"."; mangle(field-name); l"="; $(field-name); l";"
32+
};
33+
uuid(return); l";";
34+
l"}";
35+
));

PLATFORM/C/LIB/tuple.lsts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,14 @@ let print(io: IO::File, l: Tuple<x,y,z>): Nil = (
2121
);
2222
type Tuple<x,y,z> implements DefaultPrintable;
2323

24+
let cmp(l: Tuple<x,y,z>, r: Tuple<x,y,z>): Ord = (
25+
cmp(l.first, r.first) && cmp(l.second, r.second) && cmp(l.third, r.third)
26+
);
27+
28+
let deep-hash(l: Tuple<x,y,z>): U64 = (
29+
deep-hash(l.first) + deep-hash(l.second) + deep-hash(l.third)
30+
);
31+
2432
let $"=="(l: Tuple<x,y>, r: Tuple<x,y>): U64 = (
2533
l.first == r.first && l.second == r.second
2634
);

PLUGINS/FRONTEND/LSTS/lsts-smart-tokenize.lsts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ let lsts-tokenize-string(file-path: String, text: String): List<Token> = (
8181
tokens = cons(text[:id.length], tokens); text = rest;
8282
);
8383

84+
"$".. rest => (tokens = cons(text[:"$".length], tokens); text = rest;);
85+
8486
(id=r/^[a-zA-Z0-9_-]+/).. rest => (
8587
tokens = cons(text[:id.length], tokens); text = rest;
8688
);

SRC/infer-type2-definition.lsts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,36 @@ let infer-type2-definition(term: AST): Nil = (
5353
visit-field-template(field-name, guard, field-type, term);
5454
};
5555
};
56+
let common-fields = [] :: List<(CString,Type)>;
57+
let has-tag-case = false;
58+
for vector Tuple{ case-tag=first, case-fields=second } in cases {
59+
if case-tag==c"" {
60+
for vector Tuple{ field-name=first, field-type=second } in case-fields {
61+
common-fields = cons((field-name, field-type), common-fields);
62+
};
63+
} else has-tag-case = true;
64+
};
65+
if not(has-tag-case) then infer-type2-yield-constructor(lhs-type, lhs-type.simple-tag, 0, common-fields);
66+
let case-index = 0_u64;
67+
for vector Tuple{ case-tag=first, case-fields=second } in cases {
68+
if case-tag!=c"" {
69+
let o-case-fields = common-fields;
70+
for vector Tuple{ field-name=first, field-type=second } in case-fields {
71+
o-case-fields = cons((field-name, field-type), o-case-fields);
72+
};
73+
infer-type2-yield-constructor(lhs-type, case-tag, case-index, o-case-fields);
74+
case-index = case-index + 1;
75+
};
76+
};
77+
);
78+
79+
let type-constructor-tag-ordinal-index = {} :: HashtableEq<(CString,U64,CString),U64>;
80+
81+
let infer-type2-yield-constructor(base-type: Type, case-tag: CString, case-number: U64, case-fields: List<(CString,Type)>): Nil = (
82+
print("Yield constructor \{case-tag}#\{case-number} : \{base-type}\n");
83+
for Tuple{field-name=first, field-type=second} in case-fields {
84+
print("\t\{field-name} : \{field-type}\n");
85+
};
86+
(let base-tag, let base-arity) = base-type.ground-tag-and-arity;
87+
type-constructor-tag-ordinal-index = type-constructor-tag-ordinal-index.bind( (base-tag,base-arity,case-tag), case-number );
5688
);

tests/unit/typedefs.lsts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ type2 F<c,d> implements E;
1616

1717
type2 TT<a,b> = { a: a, b: b };
1818
type2 G = { a: A, b: B, h: H };
19-
type2 H = { g: TT<A,A> };
19+
type2 H = { g: TT<A,A> } H1 { g2: A } | H2 { g3: B };
2020

2121
# TODO constructor / instantiate
2222
# TODO field get/set/get indirect/set indirect

0 commit comments

Comments
 (0)