Recursive lambdas with new system
This commit is contained in:
10
lambdas.kl
10
lambdas.kl
@@ -1,13 +1,7 @@
|
|||||||
/*
|
|
||||||
|
|
||||||
@todo!!!
|
|
||||||
I think it might be better to try doing order indepent decls
|
|
||||||
as well as the tree transformations in the backend code
|
|
||||||
plus some cleanups before adding more complications to the code
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
type :: int
|
type :: int
|
||||||
|
pointer_type :: *int
|
||||||
|
null_pointer: pointer_type = null
|
||||||
|
|
||||||
if_stmt :: (cond: int): type
|
if_stmt :: (cond: int): type
|
||||||
CONSTANT :: 10
|
CONSTANT :: 10
|
||||||
|
|||||||
8
main.cpp
8
main.cpp
@@ -5,10 +5,10 @@
|
|||||||
#include "new_parse.cpp"
|
#include "new_parse.cpp"
|
||||||
#include "new_type.cpp"
|
#include "new_type.cpp"
|
||||||
#include "new_resolve.cpp"
|
#include "new_resolve.cpp"
|
||||||
#include "cgenerate.cpp"
|
#include "ccodegen.cpp"
|
||||||
|
|
||||||
/// @todo
|
/// @todo
|
||||||
/// [ ] - Typespecs should probably be expressions so stuff like would be possible :: *[32]int
|
/// [x] - Typespecs should probably be expressions so stuff like would be possible :: *[32]int
|
||||||
|
|
||||||
|
|
||||||
int main(){
|
int main(){
|
||||||
@@ -24,8 +24,8 @@ int main(){
|
|||||||
lex_test();
|
lex_test();
|
||||||
|
|
||||||
// String result = compile_file("globals.kl"_s);
|
// String result = compile_file("globals.kl"_s);
|
||||||
String result = compile_file("lambdas.kl"_s);
|
// String result = compile_file("lambdas.kl"_s);
|
||||||
// String result = compile_file("order_independent_globals.kl"_s);
|
String result = compile_file("order_independent_globals.kl"_s);
|
||||||
printf("%s", result.str);
|
printf("%s", result.str);
|
||||||
|
|
||||||
// compile_file("lambdas.kl"_s);
|
// compile_file("lambdas.kl"_s);
|
||||||
|
|||||||
@@ -334,6 +334,10 @@ eval_expr(Ast_Expr *ast, Ast_Resolved_Type *expected_type, Sym *lambda_to_comple
|
|||||||
assert(lambda_type);
|
assert(lambda_type);
|
||||||
Value val; val.type_val = lambda_type;
|
Value val; val.type_val = lambda_type;
|
||||||
sym_new_resolved(SYM_CONST, {}, type_type, val, node);
|
sym_new_resolved(SYM_CONST, {}, type_type, val, node);
|
||||||
|
if(lambda_to_complete){
|
||||||
|
lambda_to_complete->type = lambda_type;
|
||||||
|
lambda_to_complete->state = SYM_RESOLVED;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Operand result = {type_type, true};
|
Operand result = {type_type, true};
|
||||||
@@ -533,14 +537,6 @@ resolve_sym(Sym *sym){
|
|||||||
assert(sym->ast->kind == AST_VAR || sym->ast->kind == AST_CONST);
|
assert(sym->ast->kind == AST_VAR || sym->ast->kind == AST_CONST);
|
||||||
sym->state = SYM_RESOLVING;
|
sym->state = SYM_RESOLVING;
|
||||||
|
|
||||||
// @note: lambda doesn't need body for it to be usable
|
|
||||||
// quickly resolve the type so we can have recursive functions
|
|
||||||
// Ast_Lambda *lambda = ast_get_lambda(sym->ast);
|
|
||||||
// if(lambda){
|
|
||||||
// sym->type = eval_typespec(ast_typespec_lambda(lambda->pos, lambda));
|
|
||||||
// sym->state = SYM_RESOLVED;
|
|
||||||
// }
|
|
||||||
|
|
||||||
Operand op = eval_decl(sym->ast, sym);
|
Operand op = eval_decl(sym->ast, sym);
|
||||||
sym->type = op.type;
|
sym->type = op.type;
|
||||||
if(sym->kind == SYM_CONST){
|
if(sym->kind == SYM_CONST){
|
||||||
|
|||||||
Reference in New Issue
Block a user