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 /eval.c | |
parent | fbbd0b34314d58cc4d210e5ff07c2726fdadd659 (diff) |
Don't open symbols when lexing
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 41 |
1 files changed, 20 insertions, 21 deletions
@@ -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 */ } } |