From 5a5136ef9f981a603ca2e933e47cfd3a178be7cc Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Mon, 24 Jan 2022 21:42:35 +0000 Subject: Don't open symbols when lexing --- apl9.h | 3 ++- eval.c | 41 ++++++++++++++++++++--------------------- lexer.c | 4 ++-- main.c | 1 + print.c | 4 ++-- quadnames.c | 22 ++++++++++++++++++---- 6 files changed, 45 insertions(+), 30 deletions(-) diff --git a/apl9.h b/apl9.h index b19c686..cb71b2b 100644 --- a/apl9.h +++ b/apl9.h @@ -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 */ diff --git a/eval.c b/eval.c index bacd724..aff3f73 100644 --- a/eval.c +++ b/eval.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 */ } } diff --git a/lexer.c b/lexer.c index 38dc0a2..ce96a0d 100644 --- a/lexer.c +++ b/lexer.c @@ -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]; diff --git a/main.c b/main.c index 6218fa0..d0e282f 100644 --- a/main.c +++ b/main.c @@ -13,6 +13,7 @@ main(int argc, char *argv[]) int off = 0; stdin = Bfdopen(0, OREAD); initsymtab(); + initquadnames(); traceeval = 0; debugmem = 0; diff --git a/print.c b/print.c index 7e4c52e..e46866c 100644 --- a/print.c +++ b/print.c @@ -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("", 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; -- cgit v1.2.3