summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-24 00:40:00 +0000
committerPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-24 00:40:00 +0000
commit63c5e49a32fb7bdb98c0d34f2d75ee2621ee4c68 (patch)
treec1fa0a6730b070d2e2bc454f6f665ab50e5f6b09
parent464110afe0599efa5b876eb398769cdbf2a0c1df (diff)
Fix symbol lookup
-rw-r--r--apl9.h2
-rw-r--r--functions.c4
-rw-r--r--lexer.c4
-rw-r--r--quadnames.c2
-rw-r--r--symbol.c7
5 files changed, 11 insertions, 8 deletions
diff --git a/apl9.h b/apl9.h
index b6c1138..aaa8d87 100644
--- a/apl9.h
+++ b/apl9.h
@@ -223,7 +223,7 @@ Array *fillelement(Array *);
Datum *eval(Statement *, int);
/* symbol.c */
-Symbol *getsym(Rune *);
+Symbol *getsym(Rune *, int);
void initsymtab(void);
DfnFrame *getcurrentdfn(void);
DfnFrame *pushdfnframe(Rune *);
diff --git a/functions.c b/functions.c
index 207daeb..71e99c5 100644
--- a/functions.c
+++ b/functions.c
@@ -131,14 +131,14 @@ runfunc(Function f, Array *left, Array *right)
if(f.type == FunctypeDfn){
pushdfnframe(f.dfn);
if(left){
- Symbol *alpha = getsym(L"⍺");
+ Symbol *alpha = getsym(L"⍺", 1);
alpha->value.tag = ArrayTag;
alpha->value.array = left;
alpha->undefined = 0;
incref(left);
}
- Symbol *omega = getsym(L"⍵");
+ Symbol *omega = getsym(L"⍵", 1);
omega->value.tag = ArrayTag;
omega->value.array = right;
omega->undefined = 0;
diff --git a/lexer.c b/lexer.c
index 0515727..24d7e00 100644
--- a/lexer.c
+++ b/lexer.c
@@ -168,7 +168,7 @@ get_digits:
}else if(runestrchr(L"⍺⍵", peek)){
Rune name[2] = {peek, 0};
stmt->toks[stmt->ntoks].tag = NameTag;
- stmt->toks[stmt->ntoks].symbol = getsym(name);
+ stmt->toks[stmt->ntoks].symbol = getsym(name, 0);
}else if(isalpharune(peek)){
Rune buf[64];
Rune *p = buf;
@@ -179,7 +179,7 @@ get_digits:
*p = 0;
ungetrune(input);
stmt->toks[stmt->ntoks].tag = NameTag;
- stmt->toks[stmt->ntoks].symbol = getsym(buf);
+ stmt->toks[stmt->ntoks].symbol = getsym(buf, 0);
}else if(runestrchr(L"⎕⍞", peek)){
/* quad names */
Rune buf[64];
diff --git a/quadnames.c b/quadnames.c
index be543ff..093a234 100644
--- a/quadnames.c
+++ b/quadnames.c
@@ -34,7 +34,7 @@ quadnamedatum(QuadnameDef q)
d.tag = q.tag;
switch(q.tag){
case NameTag:
- d.symbol = getsym(q.name);
+ d.symbol = getsym(q.name, 0);
d.symbol->getfn = q.get;
d.symbol->setfn = q.set;
d.symbol->undefined = 0;
diff --git a/symbol.c b/symbol.c
index e67f043..e10ee7a 100644
--- a/symbol.c
+++ b/symbol.c
@@ -11,10 +11,11 @@ Symtab *newsymtab(void);
void freesymtab(Symtab *);
Symbol *
-getsym(Rune *name)
+getsym(Rune *name, int fresh)
{
DfnFrame *dfn = currentdfn;
Symtab *tab;
+ int done = 0;
do{
if(dfn != nil)
tab = dfn->symtab;
@@ -26,7 +27,9 @@ getsym(Rune *name)
return tab->syms[i];
if(dfn)
dfn = dfn->prev;
- }while(dfn != nil);
+ else
+ done = 1;
+ }while(!done && !fresh);
tab->nsyms++;
tab->syms = realloc(tab->syms, sizeof(Symbol *) * tab->nsyms);