diff options
author | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-24 21:42:35 +0000 |
---|---|---|
committer | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-24 21:42:35 +0000 |
commit | 5a5136ef9f981a603ca2e933e47cfd3a178be7cc (patch) | |
tree | fa086c71deaa2b82ad1644bb66fe69181ed1804b | |
parent | fbbd0b34314d58cc4d210e5ff07c2726fdadd659 (diff) |
Don't open symbols when lexing
-rw-r--r-- | apl9.h | 3 | ||||
-rw-r--r-- | eval.c | 41 | ||||
-rw-r--r-- | lexer.c | 4 | ||||
-rw-r--r-- | main.c | 1 | ||||
-rw-r--r-- | print.c | 4 | ||||
-rw-r--r-- | quadnames.c | 22 |
6 files changed, 45 insertions, 30 deletions
@@ -135,7 +135,7 @@ struct Datum Function func; Operator operator; int hybrid; - Symbol *symbol; + Rune *name; }; }; @@ -251,6 +251,7 @@ Array *rundfn(Rune *, Datum *, Datum *, Array *, Array *); Array *runtrain(Function *, int, Array *, Array *, Array *); /* quadnames.c */ +void initquadnames(void); Datum quadnamedatum(QuadnameDef); /* error.c */ @@ -135,25 +135,24 @@ retry: Datum * lookup(Datum var) { - traceprint("VAR LOOKUP %S\n", var.symbol->name); - /* re-assign the symbol, since it may have been changed by shadowing */ - var.symbol = getsym(var.symbol->name, 0); + traceprint("VAR LOOKUP %S\n", var.name); + Symbol *symbol = getsym(var.name, 0); - if(var.symbol->undefined){ - Rune *msg = runesmprint("Undefined name: %S", var.symbol->name); + if(symbol->undefined){ + Rune *msg = runesmprint("Undefined name: %S", var.name); throwerror(msg, EValue); } Datum *val; - if(var.symbol->getfn != nil) - val = var.symbol->getfn(); + if(symbol->getfn != nil) + val = symbol->getfn(); else{ - val = &var.symbol->value; + val = &symbol->value; if(val->tag == ArrayTag) incref(val->array); /* since the value is now in the var AND in the code */ } val->shy = 0; - traceprint("VAR %S = %S\n", var.symbol->name, ppdatum(*val)); + traceprint("VAR %S = %S\n", var.name, ppdatum(*val)); return val; } @@ -218,28 +217,28 @@ parens(Datum left, Datum right) Datum nameis(Datum left, Datum right) { - traceprint("NAME SYMBOL %p\n", left.symbol); - traceprint("NAMEIS %S←\n", left.symbol->name); + traceprint("NAMEIS %S←\n", left.name); right.tag = AssignmentTag; - right.symbol = left.symbol; + right.name = left.name; return right; } Datum assign(Datum left, Datum right) { - if(left.symbol->setfn != nil) - left.symbol->setfn(right); + Symbol *symbol = getsym(left.name, 0); + if(symbol->setfn != nil) + symbol->setfn(right); else{ /* re-assign the symbol to one that is sure to be local. This enables shadowing */ - left.symbol = getsym(left.symbol->name, 1); + symbol = getsym(left.name, 1); - if(left.symbol->undefined == 0 && left.symbol->value.tag == ArrayTag) - freearray(left.symbol->value.array); - left.symbol->value = right; - left.symbol->undefined = 0; - if(left.symbol->value.tag == ArrayTag){ - left.symbol->value.array->stranded = 0; + if(symbol->undefined == 0 && symbol->value.tag == ArrayTag) + freearray(symbol->value.array); + symbol->value = right; + symbol->undefined = 0; + if(symbol->value.tag == ArrayTag){ + symbol->value.array->stranded = 0; incref(right.array); /* for the binding */ } } @@ -180,7 +180,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, 0); + stmt->toks[stmt->ntoks].name = runestrdup(name); }else if(isalpharune(peek)){ Rune buf[64]; Rune *p = buf; @@ -191,7 +191,7 @@ get_digits: *p = 0; ungetrune(input); stmt->toks[stmt->ntoks].tag = NameTag; - stmt->toks[stmt->ntoks].symbol = getsym(buf, 0); + stmt->toks[stmt->ntoks].name = runestrdup(buf); }else if(runestrchr(L"⎕⍞", peek)){ /* quad names */ Rune buf[64]; @@ -13,6 +13,7 @@ main(int argc, char *argv[]) int off = 0; stdin = Bfdopen(0, OREAD); initsymtab(); + initquadnames(); traceeval = 0; debugmem = 0; @@ -24,8 +24,8 @@ ppdatum(Datum d) case LParTag: result = runestrdup(L"("); break; case RParTag: result = runestrdup(L")"); break; case ArrowTag: result = runestrdup(L"←"); break; - case AssignmentTag: result = runesmprint("%S←", d.symbol->name); break; - case NameTag: result = runestrdup(d.symbol->name); break; + case AssignmentTag: result = runesmprint("%S←", d.name); break; + case NameTag: result = runestrdup(d.name); break; default: result = runesmprint("<not printable %d>", d.tag); } return result; diff --git a/quadnames.c b/quadnames.c index 093a234..8ce54e1 100644 --- a/quadnames.c +++ b/quadnames.c @@ -27,6 +27,23 @@ QuadnameDef quadnames[] = { {nil, 0, nil, nil, nil, nil} /* MUST BE LAST */ }; +void +initquadnames(void) +{ + Symbol *s; + QuadnameDef q; + int i; + for(i = 0; quadnames[i].name != nil; i++){ + q = quadnames[i]; + if(q.tag == NameTag){ + s = getsym(q.name, 1); + s->getfn = q.get; + s->setfn = q.set; + s->undefined = 0; + } + } +} + Datum quadnamedatum(QuadnameDef q) { @@ -34,10 +51,7 @@ quadnamedatum(QuadnameDef q) d.tag = q.tag; switch(q.tag){ case NameTag: - d.symbol = getsym(q.name, 0); - d.symbol->getfn = q.get; - d.symbol->setfn = q.set; - d.symbol->undefined = 0; + d.name = q.name; break; case FunctionTag: d.func.type = FunctypeQuad; |