From 80ea0f85079eaac027b930b7d54df46e2039e7c3 Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Tue, 19 Mar 2024 14:30:40 -0400 Subject: Corecursive modules --- compile.c | 1 + typecheck.c | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/compile.c b/compile.c index 0567dc7d..5ebbf93e 100644 --- a/compile.c +++ b/compile.c @@ -1768,6 +1768,7 @@ module_code_t compile_file(ast_t *ast) const char *name = file_base_name(ast->file->filename); env->file_prefix = heap_strf("%s$", name); + Table_str_set(env->imports, name, env); CORD_appendf(&env->code->imports, "#include \n"); diff --git a/typecheck.c b/typecheck.c index eacf4264..eee5f6f3 100644 --- a/typecheck.c +++ b/typecheck.c @@ -208,8 +208,14 @@ void bind_statement(env_t *env, ast_t *statement) case Use: { auto use = Match(statement, Use); const char *name = file_base_name(use->path); + if (Table_str_get(*env->imports, name)) + break; + env_t *module_env = new_compilation_unit(); module_env->file_prefix = heap_strf("%s$", name); + Table_str_set(module_env->imports, name, module_env); + const char *my_name = heap_strn(CORD_to_const_char_star(env->file_prefix), CORD_len(env->file_prefix)-1); + Table_str_set(module_env->imports, my_name, env); file_t *f = load_file(use->path); if (!f) errx(1, "No such file: %s", use->path); -- cgit v1.2.3