From 63c35605a27a1793a0dd80c895be9c43309027aa Mon Sep 17 00:00:00 2001 From: NikolajDanger Date: Tue, 21 Apr 2026 14:54:36 +0200 Subject: [PATCH] :goat: Unpacking arrays --- README.md | 15 +++++++++ centvrion/ast_nodes.py | 29 ++++++++++++++++ centvrion/compiler/emit_stmt.py | 16 +++++++-- centvrion/parser.py | 12 +++++++ language/main.pdf | Bin 21167 -> 21474 bytes language/main.tex | 1 + tests.py | 58 ++++++++++++++++++++++++++++++-- 7 files changed, 127 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index edb68c6..f7aa77a 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,21 @@ Variable can consist of lower-case letters, numbers, as well as `_`. `x AVGE III` is equivalent to `DESIGNA x VT x + III`. +### Destructuring + +Multiple variables can be assigned at once by unpacking an array or multi-return function: + +``` +DEFINI pair (a, b) VT { REDI (a, b) } +DESIGNA x, y VT INVOCA pair (III, VII) +``` + +The number of targets must match the length of the array. This also works with array literals: + +``` +DESIGNA a, b, c VT [I, II, III] +``` + ## Data types ### NVLLVS `NVLLVS` is a special kind of data type in `CENTVRION`, similar to the `null` value in many other languages. `NVLLVS` can be 0 if evaluated as an int or float, or an empty string if evaluated as a string. `NVLLVS` cannot be evaluated as a boolean. diff --git a/centvrion/ast_nodes.py b/centvrion/ast_nodes.py index c55fb0a..4adae8b 100644 --- a/centvrion/ast_nodes.py +++ b/centvrion/ast_nodes.py @@ -431,6 +431,35 @@ class DesignaIndex(Node): return vtable, ValNul() +class DesignaDestructure(Node): + def __init__(self, variables: list, value: Node) -> None: + self.ids = variables + self.value = value + + def __eq__(self, other): + return type(self) == type(other) and self.ids == other.ids and self.value == other.value + + def __repr__(self) -> str: + ids_string = ", ".join(repr(i) for i in self.ids) + value_string = repr(self.value).replace('\n', '\n ') + return f"DesignaDestructure(\n [{ids_string}],\n {value_string}\n)" + + def print(self): + ids_str = ", ".join(i.print() for i in self.ids) + return f"DESIGNA {ids_str} VT {self.value.print()}" + + def _eval(self, vtable): + vtable, val = self.value.eval(vtable) + if not isinstance(val, ValList): + raise CentvrionError("Cannot destructure non-array value") + if len(val.value()) != len(self.ids): + raise CentvrionError( + f"Destructuring mismatch: {len(self.ids)} targets, {len(val.value())} values") + for id_node, item in zip(self.ids, val.value()): + vtable[id_node.name] = item + return vtable, ValNul() + + class Defini(Node): def __init__(self, name: ID, parameters: list[ID], statements: list[Node]) -> None: self.name = name diff --git a/centvrion/compiler/emit_stmt.py b/centvrion/compiler/emit_stmt.py index 2f856a4..9fac5bb 100644 --- a/centvrion/compiler/emit_stmt.py +++ b/centvrion/compiler/emit_stmt.py @@ -1,6 +1,6 @@ from centvrion.ast_nodes import ( - Designa, DesignaIndex, SiStatement, DumStatement, PerStatement, - Defini, Redi, Erumpe, Continva, ExpressionStatement, ID, + Designa, DesignaIndex, DesignaDestructure, SiStatement, DumStatement, + PerStatement, Defini, Redi, Erumpe, Continva, ExpressionStatement, ID, ) from centvrion.compiler.emit_expr import emit_expr @@ -29,6 +29,18 @@ def emit_stmt(node, ctx): ] ) + if isinstance(node, DesignaDestructure): + n = len(node.ids) + val_lines, val_var = emit_expr(node.value, ctx) + lines = val_lines[:] + lines.append(f'if ({val_var}.type != CENT_LIST) cent_type_error("Cannot destructure non-array value");') + lines.append(f'if ({val_var}.lval.len != {n}) cent_runtime_error("Destructuring mismatch");') + for i, id_node in enumerate(node.ids): + tmp = ctx.fresh_tmp() + lines.append(f"CentValue {tmp} = cent_list_index({val_var}, cent_int({i + 1}));") + lines.append(f'cent_scope_set(&_scope, "{id_node.name}", {tmp});') + return lines + if isinstance(node, SiStatement): cond_lines, cond_var = emit_expr(node.test, ctx) then_lines = _emit_body(node.statements, ctx) diff --git a/centvrion/parser.py b/centvrion/parser.py index 6f7fc81..6c34d48 100644 --- a/centvrion/parser.py +++ b/centvrion/parser.py @@ -74,6 +74,10 @@ class Parser(): def statement_designa_index(tokens): return ast_nodes.DesignaIndex(tokens[1], tokens[3], tokens[6]) + @self.pg.production('statement : KEYWORD_DESIGNA id SYMBOL_COMMA id_list_rest KEYWORD_VT expression') + def statement_designa_destructure(tokens): + return ast_nodes.DesignaDestructure([tokens[1]] + tokens[3], tokens[5]) + @self.pg.production('statement : id KEYWORD_AVGE expression') def statement_avge(tokens): return ast_nodes.Designa(tokens[0], ast_nodes.BinOp(tokens[0], tokens[2], "SYMBOL_PLUS")) @@ -258,6 +262,14 @@ class Parser(): else: return [calls[0]] + calls[2] + @self.pg.production('id_list_rest : id') + @self.pg.production('id_list_rest : id SYMBOL_COMMA id_list_rest') + def id_list_rest(calls): + if len(calls) == 1: + return [calls[0]] + else: + return [calls[0]] + calls[2] + @self.pg.production("id : ID") def id_expression(tokens): return ast_nodes.ID(tokens[0].value) diff --git a/language/main.pdf b/language/main.pdf index 0852d54c836016d2d6384526d211d4c2b456ef42..6d031a83fd1358c25fc28a1abafde7f0f035a8da 100644 GIT binary patch delta 13374 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 Y%n=)t!d38LnVDHwVaUnF6(wN)AAKLtg8%>k delta 13060 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