diff options
author | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-24 00:40:00 +0000 |
---|---|---|
committer | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-24 00:40:00 +0000 |
commit | 63c5e49a32fb7bdb98c0d34f2d75ee2621ee4c68 (patch) | |
tree | c1fa0a6730b070d2e2bc454f6f665ab50e5f6b09 | |
parent | 464110afe0599efa5b876eb398769cdbf2a0c1df (diff) |
Fix symbol lookup
-rw-r--r-- | apl9.h | 2 | ||||
-rw-r--r-- | functions.c | 4 | ||||
-rw-r--r-- | lexer.c | 4 | ||||
-rw-r--r-- | quadnames.c | 2 | ||||
-rw-r--r-- | symbol.c | 7 |
5 files changed, 11 insertions, 8 deletions
@@ -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; @@ -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; @@ -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); |