diff options
| -rw-r--r-- | README.md | 14 | ||||
| -rw-r--r-- | src/ast/ast.h | 1 | ||||
| -rw-r--r-- | src/lexer/token.c | 4 | ||||
| -rw-r--r-- | src/parser/parser.h | 14 | ||||
| -rw-r--r-- | src/parser/parser_expr.c | 10 | ||||
| -rw-r--r-- | src/parser/parser_stmt.c | 21 | ||||
| -rw-r--r-- | src/parser/parser_utils.c | 22 | ||||
| -rw-r--r-- | src/utils/utils.c | 4 | ||||
| -rw-r--r-- | src/zprep.h | 1 | ||||
| -rw-r--r-- | tests/memory/test_memory_safety.zc | 8 |
10 files changed, 5 insertions, 94 deletions
@@ -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; } |
