summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c41
1 files changed, 20 insertions, 21 deletions
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 */
}
}