aboutsummaryrefslogtreecommitdiff
path: root/src/compile/list.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2025-08-24 15:32:17 -0400
committerBruce Hill <bruce@bruce-hill.com>2025-08-24 15:32:17 -0400
commitc62c3200c7078f58b218def14c54bbfd26677069 (patch)
treeb4e2d4b943ca3a63a95d6e516ff5bb45a46f238e /src/compile/list.c
parent3f9f82ca53ed353d10ae65fc958e73193e8d9739 (diff)
Pluralize filenames
Diffstat (limited to 'src/compile/list.c')
-rw-r--r--src/compile/list.c61
1 files changed, 0 insertions, 61 deletions
diff --git a/src/compile/list.c b/src/compile/list.c
deleted file mode 100644
index 01036cda..00000000
--- a/src/compile/list.c
+++ /dev/null
@@ -1,61 +0,0 @@
-// Compilation logic for lists
-
-#include <gc.h>
-#include <glob.h>
-#include <gmp.h>
-#include <uninorm.h>
-
-#include "../ast.h"
-#include "../compile.h"
-#include "../config.h"
-#include "../environment.h"
-#include "../stdlib/text.h"
-#include "../stdlib/util.h"
-
-static ast_t *add_to_list_comprehension(ast_t *item, ast_t *subject) {
- return WrapAST(item, MethodCall, .name = "insert", .self = subject, .args = new (arg_ast_t, .value = item));
-}
-
-public
-Text_t compile_typed_list(env_t *env, ast_t *ast, type_t *list_type) {
- DeclareMatch(list, ast, List);
- if (!list->items) return Text("(List_t){.length=0}");
-
- type_t *item_type = Match(list_type, ListType)->item_type;
-
- int64_t n = 0;
- for (ast_list_t *item = list->items; item; item = item->next) {
- ++n;
- if (item->ast->tag == Comprehension) goto list_comprehension;
- }
-
- {
- env_t *scope = item_type->tag == EnumType ? with_enum_scope(env, item_type) : env;
- if (is_incomplete_type(item_type)) code_err(ast, "This list's type can't be inferred!");
- Text_t code = Texts("TypedListN(", compile_type(item_type), ", ", String(n));
- for (ast_list_t *item = list->items; item; item = item->next) {
- code = Texts(code, ", ", compile_to_type(scope, item->ast, item_type));
- }
- return Texts(code, ")");
- }
-
-list_comprehension: {
- env_t *scope = item_type->tag == EnumType ? with_enum_scope(env, item_type) : fresh_scope(env);
- static int64_t comp_num = 1;
- const char *comprehension_name = String("list$", comp_num++);
- ast_t *comprehension_var =
- LiteralCode(Texts("&", comprehension_name), .type = Type(PointerType, .pointed = list_type, .is_stack = true));
- Closure_t comp_action = {.fn = add_to_list_comprehension, .userdata = comprehension_var};
- scope->comprehension_action = &comp_action;
- Text_t code = Texts("({ List_t ", comprehension_name, " = {};");
- // set_binding(scope, comprehension_name, list_type, comprehension_name);
- for (ast_list_t *item = list->items; item; item = item->next) {
- if (item->ast->tag == Comprehension) code = Texts(code, "\n", compile_statement(scope, item->ast));
- else code = Texts(code, compile_statement(env, add_to_list_comprehension(item->ast, comprehension_var)));
- }
- code = Texts(code, " ", comprehension_name, "; })");
- return code;
-}
-}
-
-// vim: ts=4 sw=0 et cino=L2,l1,(0,W4,m1,\:0