summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apl9.h1
-rw-r--r--eval.c7
-rw-r--r--quadnames.c1
-rw-r--r--symbol.c9
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 *