Allow recursive types.
This commit is contained in:
parent
1be78c3548
commit
e039e44592
|
@ -7,6 +7,6 @@ namespace lily {
|
||||||
struct constructor {
|
struct constructor {
|
||||||
int parent_type;
|
int parent_type;
|
||||||
int tag;
|
int tag;
|
||||||
std::vector<type_ptr> params;
|
std::vector<std::weak_ptr<type>> params;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@ int main() {
|
||||||
lily::parse(
|
lily::parse(
|
||||||
"data Bool = { True, False }\n"
|
"data Bool = { True, False }\n"
|
||||||
"data Color = { Red, Black }\n"
|
"data Color = { Red, Black }\n"
|
||||||
"data IntList = { Nil, Cons(Int, Int) }\n"
|
"data IntList = { Nil, Cons(Int, IntList) }\n"
|
||||||
"defn add x y = { x + y }");
|
"defn add x y = { x + y }");
|
||||||
} catch(lily::error& e) {
|
} catch(lily::error& e) {
|
||||||
std::cout << e.message << std::endl;
|
std::cout << e.message << std::endl;
|
||||||
|
|
|
@ -167,10 +167,10 @@ namespace lily {
|
||||||
return prog.types[str];
|
return prog.types[str];
|
||||||
}
|
}
|
||||||
|
|
||||||
static void collect_type_params(program& prog, std::vector<type_ptr>& into, pgs_tree* params, const char* source) {
|
static void collect_type_params(program& prog, std::vector<std::weak_ptr<type>>& into, pgs_tree* params, const char* source) {
|
||||||
while(true) {
|
while(true) {
|
||||||
pgs_tree* param = PGS_TREE_NT_CHILD(*params, 0);
|
pgs_tree* param = PGS_TREE_NT_CHILD(*params, 0);
|
||||||
into.push_back(type_tree(prog, param, source));
|
into.push_back(std::weak_ptr<type>(type_tree(prog, param, source)));
|
||||||
|
|
||||||
if(PGS_TREE_NT_COUNT(*params) == 1) break;
|
if(PGS_TREE_NT_COUNT(*params) == 1) break;
|
||||||
params = PGS_TREE_NT_CHILD(*params, 2);
|
params = PGS_TREE_NT_CHILD(*params, 2);
|
||||||
|
@ -213,9 +213,9 @@ namespace lily {
|
||||||
if(prog.types.count(data_name)) throw error("cannot redefine type");
|
if(prog.types.count(data_name)) throw error("cannot redefine type");
|
||||||
|
|
||||||
int new_type = prog.next_free_type_id++;
|
int new_type = prog.next_free_type_id++;
|
||||||
|
prog.types[data_name] = type_ptr(new type_int(new_type));
|
||||||
collect_constructors(prog, new_type,
|
collect_constructors(prog, new_type,
|
||||||
PGS_TREE_NT_CHILD(*PGS_TREE_NT_CHILD(*def, PGS_TREE_NT_COUNT(*def) - 1), 1), source);
|
PGS_TREE_NT_CHILD(*PGS_TREE_NT_CHILD(*def, PGS_TREE_NT_COUNT(*def) - 1), 1), source);
|
||||||
prog.types[data_name] = type_ptr(new type_int(new_type));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user