summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian>2026-01-17 11:21:35 +0000
committerZuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian>2026-01-17 11:21:35 +0000
commit91e763a600afc86e9630e4db592d8108f65def16 (patch)
tree0e2178b729edcdb8e8278976f8d57998d653d1e3
parent3704ce90083862680f7768916e1a40ddb85e833d (diff)
Remove immutability directive.
-rw-r--r--README.md14
-rw-r--r--src/ast/ast.h1
-rw-r--r--src/lexer/token.c4
-rw-r--r--src/parser/parser.h14
-rw-r--r--src/parser/parser_expr.c10
-rw-r--r--src/parser/parser_stmt.c21
-rw-r--r--src/parser/parser_utils.c22
-rw-r--r--src/utils/utils.c4
-rw-r--r--src/zprep.h1
-rw-r--r--tests/memory/test_memory_safety.zc8
10 files changed, 5 insertions, 94 deletions
diff --git a/README.md b/README.md
index c36cb56..98ab1e3 100644
--- a/README.md
+++ b/README.md
@@ -74,19 +74,6 @@ const PI = 3.14159; // Compile-time constant
var explicit: float = 1.0; // Explicit type
```
-#### Mutability
-By default, variables are mutable. You can enable **Immutable by Default** mode using a directive.
-
-```zc
-//> immutable-by-default
-
-var x = 10;
-// x = 20; // Error: x is immutable
-
-var mut y = 10;
-y = 20; // OK
-```
-
### 2. Primitive Types
| Type | C Equivalent | Description |
@@ -524,7 +511,6 @@ Zen C supports special comments at the top of your source file to configure the
| `//> pkg-config:` | `gtk+-3.0` | Run `pkg-config` and append `--cflags` and `--libs`. |
| `//> shell:` | `command` | Execute a shell command during the build. |
| `//> get:` | `http://url/file` | Download a file if specific file does not exist. |
-| `//> immutable-by-default` | None | Make variables immutable unless declared `mut`. |
#### Examples
diff --git a/src/ast/ast.h b/src/ast/ast.h
index e9270c8..3269e55 100644
--- a/src/ast/ast.h
+++ b/src/ast/ast.h
@@ -195,7 +195,6 @@ struct ASTNode
ASTNode *init_expr;
Type *type_info;
int is_autofree;
- int is_mutable;
int is_static;
} var_decl;
diff --git a/src/lexer/token.c b/src/lexer/token.c
index 54fa5d3..eec7b87 100644
--- a/src/lexer/token.c
+++ b/src/lexer/token.c
@@ -173,10 +173,6 @@ Token lexer_next(Lexer *l)
{
return (Token){TOK_VOLATILE, s, 8, start_line, start_col};
}
- if (len == 3 && strncmp(s, "mut", 3) == 0)
- {
- return (Token){TOK_MUT, s, 3, start_line, start_col};
- }
if (len == 5 && strncmp(s, "async", 5) == 0)
{
return (Token){TOK_ASYNC, s, 5, start_line, start_col};
diff --git a/src/parser/parser.h b/src/parser/parser.h
index 3f2e763..f54bae0 100644
--- a/src/parser/parser.h
+++ b/src/parser/parser.h
@@ -37,7 +37,6 @@ typedef struct Symbol
char *name;
char *type_name;
Type *type_info;
- int is_mutable;
int is_used;
int is_autofree;
Token decl_token;
@@ -103,13 +102,6 @@ typedef struct ImportedFile
struct ImportedFile *next;
} ImportedFile;
-typedef struct VarMutability
-{
- char *name;
- int is_mutable;
- struct VarMutability *next;
-} VarMutability;
-
// Instantiation tracking
typedef struct Instantiation
{
@@ -250,11 +242,9 @@ struct ParserContext
ImportedPlugin *imported_plugins; // Plugin imports
// Config/State
- int immutable_by_default;
char *current_impl_struct;
// Internal tracking
- VarMutability *var_mutability_table;
DeprecatedFunc *deprecated_funcs;
// LSP / Fault Tolerance
@@ -377,10 +367,6 @@ void register_selective_import(ParserContext *ctx, const char *symbol, const cha
const char *source_module);
SelectiveImport *find_selective_import(ParserContext *ctx, const char *name);
-// Mutability tracking
-void register_var_mutability(ParserContext *ctx, const char *name, int is_mutable);
-int is_var_mutable(ParserContext *ctx, const char *name);
-
// External symbol tracking (C interop)
void register_extern_symbol(ParserContext *ctx, const char *name);
int is_extern_symbol(ParserContext *ctx, const char *name);
diff --git a/src/parser/parser_expr.c b/src/parser/parser_expr.c
index 975d237..99ce7d1 100644
--- a/src/parser/parser_expr.c
+++ b/src/parser/parser_expr.c
@@ -3486,16 +3486,6 @@ ASTNode *parse_expr_prec(ParserContext *ctx, Lexer *l, Precedence min_prec)
{
zpanic_at(op, "Cannot assign to const variable '%s'", lhs->var_ref.name);
}
-
- // Check if the variable is immutable
- if (!is_var_mutable(ctx, lhs->var_ref.name))
- {
- zpanic_at(op,
- "Cannot assign to immutable variable '%s' (use 'var mut' "
- "to make it "
- "mutable)",
- lhs->var_ref.name);
- }
}
}
diff --git a/src/parser/parser_stmt.c b/src/parser/parser_stmt.c
index ac2d622..c9b144d 100644
--- a/src/parser/parser_stmt.c
+++ b/src/parser/parser_stmt.c
@@ -860,19 +860,6 @@ ASTNode *parse_var_decl(ParserContext *ctx, Lexer *l)
{
lexer_next(l); // eat 'var'
- // Check for 'mut' keyword
- int is_mutable = 0;
- if (lexer_peek(l).type == TOK_MUT)
- {
- is_mutable = 1;
- lexer_next(l);
- }
- else
- {
- // Default mutability depends on directive
- is_mutable = !ctx->immutable_by_default;
- }
-
// Destructuring: var {x, y} = ...
if (lexer_peek(l).type == TOK_LBRACE || lexer_peek(l).type == TOK_LPAREN)
{
@@ -887,8 +874,6 @@ ASTNode *parse_var_decl(ParserContext *ctx, Lexer *l)
// UPDATE: Pass NULL to add_symbol
names[count++] = nm;
add_symbol(ctx, nm, "unknown", NULL);
- // Register mutability for each destructured variable
- register_var_mutability(ctx, nm, is_mutable);
Token next = lexer_next(l);
if (next.type == (is_struct ? TOK_RBRACE : TOK_RPAREN))
{
@@ -950,7 +935,6 @@ ASTNode *parse_var_decl(ParserContext *ctx, Lexer *l)
}
// Register symbol for variable
add_symbol(ctx, names[count], "unknown", NULL);
- register_var_mutability(ctx, names[count], is_mutable);
count++;
@@ -1036,7 +1020,6 @@ ASTNode *parse_var_decl(ParserContext *ctx, Lexer *l)
n->destruct.else_block = else_blk;
add_symbol(ctx, val_name, "unknown", NULL);
- register_var_mutability(ctx, val_name, is_mutable);
return n;
}
@@ -1179,10 +1162,9 @@ ASTNode *parse_var_decl(ParserContext *ctx, Lexer *l)
// Register in symbol table with actual token
add_symbol_with_token(ctx, name, type, type_obj, name_tok);
- register_var_mutability(ctx, name, is_mutable);
// NEW: Capture Const Integer Values
- if (!is_mutable && init && init->type == NODE_EXPR_LITERAL && init->literal.type_kind == 0)
+ if (init && init->type == NODE_EXPR_LITERAL && init->literal.type_kind == 0)
{
Symbol *s = find_symbol_entry(ctx, name); // Helper to find the struct
if (s)
@@ -1201,7 +1183,6 @@ ASTNode *parse_var_decl(ParserContext *ctx, Lexer *l)
n->token = name_tok; // Save location
n->var_decl.name = name;
n->var_decl.type_str = type;
- n->var_decl.is_mutable = is_mutable;
n->type_info = type_obj;
// Auto-construct Trait Object
diff --git a/src/parser/parser_utils.c b/src/parser/parser_utils.c
index 7c45178..d2214eb 100644
--- a/src/parser/parser_utils.c
+++ b/src/parser/parser_utils.c
@@ -177,7 +177,6 @@ void add_symbol_with_token(ParserContext *ctx, const char *n, const char *t, Typ
s->name = xstrdup(n);
s->type_name = t ? xstrdup(t) : NULL;
s->type_info = type_info;
- s->is_mutable = 1;
s->is_used = 0;
s->decl_token = tok;
s->is_const_value = 0;
@@ -538,27 +537,6 @@ void register_lambda(ParserContext *ctx, ASTNode *node)
ctx->global_lambdas = ref;
}
-void register_var_mutability(ParserContext *ctx, const char *name, int is_mutable)
-{
- VarMutability *v = xmalloc(sizeof(VarMutability));
- v->name = xstrdup(name);
- v->is_mutable = is_mutable;
- v->next = ctx->var_mutability_table;
- ctx->var_mutability_table = v;
-}
-
-int is_var_mutable(ParserContext *ctx, const char *name)
-{
- for (VarMutability *v = ctx->var_mutability_table; v; v = v->next)
- {
- if (strcmp(v->name, name) == 0)
- {
- return v->is_mutable;
- }
- }
- return 1;
-}
-
void register_extern_symbol(ParserContext *ctx, const char *name)
{
// Check for duplicates
diff --git a/src/utils/utils.c b/src/utils/utils.c
index 66a0a22..775e385 100644
--- a/src/utils/utils.c
+++ b/src/utils/utils.c
@@ -728,10 +728,6 @@ void scan_build_directives(ParserContext *ctx, const char *src)
strcat(g_link_flags, flags);
}
}
- else if (strncmp(line, "immutable-by-default", 20) == 0)
- {
- ctx->immutable_by_default = 1;
- }
p += len;
}
diff --git a/src/zprep.h b/src/zprep.h
index 4508f1f..bf770a3 100644
--- a/src/zprep.h
+++ b/src/zprep.h
@@ -75,7 +75,6 @@ typedef enum
TOK_UNION,
TOK_ASM,
TOK_VOLATILE,
- TOK_MUT,
TOK_ASYNC,
TOK_AWAIT,
TOK_PREPROC,
diff --git a/tests/memory/test_memory_safety.zc b/tests/memory/test_memory_safety.zc
index 5cec2db..9f9b649 100644
--- a/tests/memory/test_memory_safety.zc
+++ b/tests/memory/test_memory_safety.zc
@@ -38,8 +38,8 @@ fn distance(p1: Point, p2: Point) -> int {
}
fn accumulate(start: int, count: int) -> int {
- var mut sum = start;
- var mut i = 0;
+ var sum = start;
+ var i = 0;
while (i < count) {
sum += i;
i++;
@@ -53,9 +53,9 @@ fn process_point(p: Point) -> Point {
}
fn counter_immut() {
- var mut count = 0;
+ var count = 0;
{
- var mut inner = 10;
+ var inner = 10;
inner = inner + 5;
count = count + inner;
}