From e195d66a333102924bae452ba09dc20cba4e96e6 Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Wed, 9 Feb 2022 13:08:12 +0000 Subject: Since symbols now have pointers to their values, we don't need the symbol.undefined field anymore --- apl9.h | 1 - eval.c | 7 ++----- quadnames.c | 1 - symbol.c | 9 ++------- 4 files changed, 4 insertions(+), 14 deletions(-) diff --git a/apl9.h b/apl9.h index 8b32141..3f592d9 100644 --- a/apl9.h +++ b/apl9.h @@ -158,7 +158,6 @@ struct Datum struct Symbol { - int undefined; Rune *name; Datum *value; Datum *(*getfn)(void); diff --git a/eval.c b/eval.c index b7515b1..ea7e84f 100644 --- a/eval.c +++ b/eval.c @@ -141,7 +141,7 @@ lookup(Datum *var) traceprint("VAR LOOKUP %S\n", var->name); Symbol *symbol = getsym(var->name, 0); - if(symbol->undefined){ + if(symbol->value == nil && symbol->getfn == nil){ Rune *msg = runesmprint("Undefined name: %S", var->name); throwerror(msg, EValue); } @@ -259,12 +259,9 @@ assign(Datum *left, Datum *right) else{ /* re-assign the symbol to one that is sure to be local. This enables shadowing */ symbol = getsym(symbol->name, 1); - - if(symbol->undefined == 0) - freedatum(symbol->value); + freedatum(symbol->value); symbol->value = right; incdatumref(right); - symbol->undefined = 0; if(symbol->value->tag == ArrayTag) symbol->value->array->stranded = 0; } diff --git a/quadnames.c b/quadnames.c index 57c5dbb..209c339 100644 --- a/quadnames.c +++ b/quadnames.c @@ -61,7 +61,6 @@ initquadnames(void) s = getsym(q.name, 1); s->getfn = q.get; s->setfn = q.set; - s->undefined = 0; } } } diff --git a/symbol.c b/symbol.c index 046857b..8f4797a 100644 --- a/symbol.c +++ b/symbol.c @@ -47,9 +47,9 @@ getsym(Rune *name, int fresh) tab->syms = erealloc(tab->syms, sizeof(Symbol *) * tab->nsyms); tab->syms[tab->nsyms-1] = emalloc(sizeof(Symbol)); tab->syms[tab->nsyms-1]->name = runestrdup(name); - tab->syms[tab->nsyms-1]->undefined = 1; tab->syms[tab->nsyms-1]->getfn = nil; tab->syms[tab->nsyms-1]->setfn = nil; + tab->syms[tab->nsyms-1]->value = nil; return tab->syms[tab->nsyms-1]; } @@ -71,8 +71,7 @@ freesymtab(Symtab *tab) int i; for(i = 0; i < tab->nsyms; i++){ Symbol *s = tab->syms[i]; - if(s->undefined == 0) - freedatum(s->value); + freedatum(s->value); free(s->name); } free(tab->syms); @@ -87,22 +86,18 @@ initsymtab(void) s = getsym(L"⍺", 1); s->getfn = getalpha; s->setfn = setalpha; - s->undefined = 0; s = getsym(L"⍵", 1); s->getfn = getomega; s->setfn = setsyntaxerr; - s->undefined = 0; s = getsym(L"⍶", 1); s->getfn = getalphao; s->setfn = setsyntaxerr; - s->undefined = 0; s = getsym(L"⍹", 1); s->getfn = getomegao; s->setfn = setsyntaxerr; - s->undefined = 0; } DfnFrame * -- cgit v1.2.3