From 382492a6fcd590a3f6f96785f4111e588b64f8b7 Mon Sep 17 00:00:00 2001 From: NikolajDanger Date: Sat, 25 Apr 2026 20:20:54 +0200 Subject: [PATCH] :goat: MVTA, CRIBRA, CONFLA --- README.md | 30 ++++++++++ centvrion/ast_nodes.py | 45 ++++++++++++++ centvrion/compiler/emit_expr.py | 21 +++++++ centvrion/compiler/runtime/cent_runtime.c | 56 ++++++++++++++++++ centvrion/compiler/runtime/cent_runtime.h | 3 + centvrion/lexer.py | 3 + snippets/confla.cent | 4 ++ snippets/confla.png | Bin 0 -> 20253 bytes snippets/cribra.cent | 3 + snippets/cribra.png | Bin 0 -> 21449 bytes snippets/mvta.cent | 4 ++ snippets/mvta.png | Bin 0 -> 16723 bytes snippets/syntaxes/centvrion.sublime-syntax | 2 +- tests/03_test_builtins.py | 38 ++++++++++++ tests/12_test_failures.py | 16 +++++ .../syntaxes/cent.tmLanguage.json | 2 +- 16 files changed, 225 insertions(+), 2 deletions(-) create mode 100644 snippets/confla.cent create mode 100644 snippets/confla.png create mode 100644 snippets/cribra.cent create mode 100644 snippets/cribra.png create mode 100644 snippets/mvta.cent create mode 100644 snippets/mvta.png diff --git a/README.md b/README.md index 8d2a6e0..d603c17 100644 --- a/README.md +++ b/README.md @@ -370,6 +370,36 @@ With a comparator, the type-uniformity rule is dropped — the comparator decide > [V III II I] ``` +### MVTA +`MVTA(array, fn)` + +Returns a new array obtained by applying `fn` to every element of `array`. The original array is unchanged. `fn` must be a function of exactly one parameter; its return value is unrestricted, so `MVTA` may produce an array of a different element type than its input. + +![MVTA doubling each element](snippets/mvta.png) +``` +> [II IV VI VIII] +``` + +### CRIBRA +`CRIBRA(array, predicate)` + +Returns a new array containing the elements of `array` for which `predicate` returns `VERITAS`, in their original order. The original array is unchanged. `predicate` must be a function of exactly one parameter and must return `VERAX`. + +![CRIBRA keeping elements ≤ III](snippets/cribra.png) +``` +> [I II III] +``` + +### CONFLA +`CONFLA(array, initial, fn)` + +Left fold: starts with `initial` as the accumulator, then for each element `e` of `array` updates the accumulator to `fn(acc, e)`, and returns the final accumulator. The original array is unchanged. `fn` must be a function of exactly two parameters. If `array` is empty, `initial` is returned unchanged. + +![CONFLA summing elements](snippets/confla.png) +``` +> XVI +``` + ### ADDE `ADDE(array, value)` diff --git a/centvrion/ast_nodes.py b/centvrion/ast_nodes.py index 96e65f8..f1e2b25 100644 --- a/centvrion/ast_nodes.py +++ b/centvrion/ast_nodes.py @@ -1580,6 +1580,51 @@ class BuiltIn(Node): if not (all_numeric or all_string): raise CentvrionError("ORDINA requires all elements to be numbers or all strings") return vtable, ValList(sorted(items, key=lambda v: v.value())) + case "MVTA": + if len(params) != 2: + raise CentvrionError("MVTA takes II arguments") + if not isinstance(params[0], ValList): + raise CentvrionError("MVTA requires an array") + fn = params[1] + if not isinstance(fn, ValFunc): + raise CentvrionError("MVTA requires a function") + if len(fn.params) != 1: + raise CentvrionError("MVTA function must take I argument") + out = [_call_func(fn, [item], vtable, "MVTA function") + for item in params[0].value()] + return vtable, ValList(out) + case "CRIBRA": + if len(params) != 2: + raise CentvrionError("CRIBRA takes II arguments") + if not isinstance(params[0], ValList): + raise CentvrionError("CRIBRA requires an array") + fn = params[1] + if not isinstance(fn, ValFunc): + raise CentvrionError("CRIBRA requires a function") + if len(fn.params) != 1: + raise CentvrionError("CRIBRA predicate must take I argument") + out = [] + for item in params[0].value(): + r = _call_func(fn, [item], vtable, "CRIBRA predicate") + if not isinstance(r, ValBool): + raise CentvrionError("CRIBRA predicate must return VERAX") + if r.value(): + out.append(item) + return vtable, ValList(out) + case "CONFLA": + if len(params) != 3: + raise CentvrionError("CONFLA takes III arguments") + if not isinstance(params[0], ValList): + raise CentvrionError("CONFLA requires an array") + fn = params[2] + if not isinstance(fn, ValFunc): + raise CentvrionError("CONFLA requires a function") + if len(fn.params) != 2: + raise CentvrionError("CONFLA function must take II arguments") + acc = params[1] + for item in params[0].value(): + acc = _call_func(fn, [acc, item], vtable, "CONFLA function") + return vtable, acc case "TYPVS": type_map = { ValInt: "NVMERVS", ValStr: "LITTERA", ValBool: "VERAX", diff --git a/centvrion/compiler/emit_expr.py b/centvrion/compiler/emit_expr.py index bed2b2f..aa53fcd 100644 --- a/centvrion/compiler/emit_expr.py +++ b/centvrion/compiler/emit_expr.py @@ -320,6 +320,27 @@ def _emit_builtin(node, ctx): else: raise CentvrionError("ORDINA takes 1 or 2 arguments") + case "MVTA": + if len(param_vars) != 2: + raise CentvrionError("MVTA takes II arguments") + lines.append( + f"CentValue {tmp} = cent_mvta({param_vars[0]}, {param_vars[1]}, _scope);" + ) + + case "CRIBRA": + if len(param_vars) != 2: + raise CentvrionError("CRIBRA takes II arguments") + lines.append( + f"CentValue {tmp} = cent_cribra({param_vars[0]}, {param_vars[1]}, _scope);" + ) + + case "CONFLA": + if len(param_vars) != 3: + raise CentvrionError("CONFLA takes III arguments") + lines.append( + f"CentValue {tmp} = cent_confla({param_vars[0]}, {param_vars[1]}, {param_vars[2]}, _scope);" + ) + case "ADDE": lines.append(f"CentValue {tmp} = cent_adde({param_vars[0]}, {param_vars[1]});") diff --git a/centvrion/compiler/runtime/cent_runtime.c b/centvrion/compiler/runtime/cent_runtime.c index 44b003d..867d9a2 100644 --- a/centvrion/compiler/runtime/cent_runtime.c +++ b/centvrion/compiler/runtime/cent_runtime.c @@ -897,6 +897,62 @@ CentValue cent_ordina_cmp(CentValue lst, CentValue cmp, CentScope scope) { return result; } +CentValue cent_mvta(CentValue lst, CentValue fn, CentScope scope) { + if (lst.type != CENT_LIST) + cent_type_error("'MVTA' requires an array"); + if (fn.type != CENT_FUNC) + cent_type_error("'MVTA' requires a function"); + if (fn.fnval.param_count != 1) + cent_runtime_error("'MVTA' function must take I argument"); + int len = lst.lval.len; + CentValue result = cent_list_new(len); + for (int i = 0; i < len; i++) { + CentScope s = cent_scope_copy(&scope); + cent_scope_set(&s, fn.fnval.param_names[0], lst.lval.items[i]); + cent_list_push(&result, fn.fnval.fn(s)); + } + return result; +} + +CentValue cent_cribra(CentValue lst, CentValue fn, CentScope scope) { + if (lst.type != CENT_LIST) + cent_type_error("'CRIBRA' requires an array"); + if (fn.type != CENT_FUNC) + cent_type_error("'CRIBRA' requires a function"); + if (fn.fnval.param_count != 1) + cent_runtime_error("'CRIBRA' predicate must take I argument"); + int len = lst.lval.len; + CentValue result = cent_list_new(len); + for (int i = 0; i < len; i++) { + CentScope s = cent_scope_copy(&scope); + cent_scope_set(&s, fn.fnval.param_names[0], lst.lval.items[i]); + CentValue r = fn.fnval.fn(s); + if (r.type != CENT_BOOL) + cent_type_error("'CRIBRA' predicate must return VERAX"); + if (r.bval) + cent_list_push(&result, lst.lval.items[i]); + } + return result; +} + +CentValue cent_confla(CentValue lst, CentValue init, CentValue fn, CentScope scope) { + if (lst.type != CENT_LIST) + cent_type_error("'CONFLA' requires an array"); + if (fn.type != CENT_FUNC) + cent_type_error("'CONFLA' requires a function"); + if (fn.fnval.param_count != 2) + cent_runtime_error("'CONFLA' function must take II arguments"); + CentValue acc = init; + int len = lst.lval.len; + for (int i = 0; i < len; i++) { + CentScope s = cent_scope_copy(&scope); + cent_scope_set(&s, fn.fnval.param_names[0], acc); + cent_scope_set(&s, fn.fnval.param_names[1], lst.lval.items[i]); + acc = fn.fnval.fn(s); + } + return acc; +} + static long _index_arg(CentValue idx, const char *name) { if (idx.type == CENT_INT) return idx.ival; diff --git a/centvrion/compiler/runtime/cent_runtime.h b/centvrion/compiler/runtime/cent_runtime.h index fcc6d15..a1328e9 100644 --- a/centvrion/compiler/runtime/cent_runtime.h +++ b/centvrion/compiler/runtime/cent_runtime.h @@ -240,6 +240,9 @@ CentValue cent_typvs(CentValue v); /* TYPVS */ void cent_dormi(CentValue n); /* DORMI */ CentValue cent_ordina(CentValue lst); /* ORDINA */ CentValue cent_ordina_cmp(CentValue lst, CentValue cmp, CentScope scope); /* ORDINA w/ comparator */ +CentValue cent_mvta(CentValue lst, CentValue fn, CentScope scope); /* MVTA */ +CentValue cent_cribra(CentValue lst, CentValue fn, CentScope scope); /* CRIBRA */ +CentValue cent_confla(CentValue lst, CentValue init, CentValue fn, CentScope scope); /* CONFLA */ CentValue cent_adde(CentValue lst, CentValue v); /* ADDE */ CentValue cent_tolle(CentValue lst, CentValue idx); /* TOLLE */ CentValue cent_insere(CentValue lst, CentValue idx, CentValue v); /* INSERE */ diff --git a/centvrion/lexer.py b/centvrion/lexer.py index 66c5dee..0e68727 100644 --- a/centvrion/lexer.py +++ b/centvrion/lexer.py @@ -50,6 +50,8 @@ builtin_tokens = [("BUILTIN", i) for i in [ "AVDI_NVMERVS", "AVDI", "CLAVES", + "CONFLA", + "CRIBRA", "DECIMATIO", "DIC", "DORMI", @@ -62,6 +64,7 @@ builtin_tokens = [("BUILTIN", i) for i in [ "LONGITVDO", "MAIVSCVLA", "MINVSCVLA", + "MVTA", "NECTE", "NVMERVS", "ORDINA", diff --git a/snippets/confla.cent b/snippets/confla.cent new file mode 100644 index 0000000..c0af401 --- /dev/null +++ b/snippets/confla.cent @@ -0,0 +1,4 @@ +DEFINI addi (a, b) VT { + REDI (a + b) +} +DIC (CONFLA([I, II, III, IV, V], I, addi)) diff --git a/snippets/confla.png b/snippets/confla.png new file mode 100644 index 0000000000000000000000000000000000000000..5368f03af12cb5e45eacbd997511e9c585c600db GIT binary patch literal 20253 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 Pp|xv*R_DF{+0p+G#QcgH literal 0 HcmV?d00001 diff --git a/snippets/mvta.cent b/snippets/mvta.cent new file mode 100644 index 0000000..6f20203 --- /dev/null +++ b/snippets/mvta.cent @@ -0,0 +1,4 @@ +DEFINI dbl (x) VT { + REDI (x + x) +} +DIC (MVTA([I, II, III, IV], dbl)) diff --git a/snippets/mvta.png b/snippets/mvta.png new file mode 100644 index 0000000000000000000000000000000000000000..704afae321cd196f04da57b7c0ffaddf1fcf330c GIT binary patch literal 16723 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