diff options
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 40 |
1 files changed, 27 insertions, 13 deletions
@@ -137,16 +137,22 @@ Datum * lookup(Datum var) { traceprint("VAR LOOKUP %S\n", var.symbol->name); + if(var.symbol->undefined){ errormsg = runesmprint("Variable undefined: %S\n", var.symbol->name); return nil; - }else{ - Datum *val = &var.symbol->value; - val->shy = 0; + } + + Datum *val; + if(var.symbol->getfn != nil) + val = var.symbol->getfn(); + else{ + val = &var.symbol->value; if(val->tag == ArrayTag) incref(val->array); /* since the value is now in the var AND in the code */ - return val; } + val->shy = 0; + return val; } Datum @@ -215,17 +221,25 @@ nameis(Datum left, Datum right) Datum assign(Datum left, Datum right) { - if(left.symbol->undefined == 0) - 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; - incref(right.array); /* for the binding */ - incref(right.array); /* for the returned array */ + if(left.symbol->setfn != nil){ + int ok = left.symbol->setfn(right); + if(!ok){ + print("Assignment failed\n"); + exits(nil); + } + }else{ + 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; + incref(right.array); /* for the binding */ + } } right.shy = 1; + if(right.tag == ArrayTag) + incref(right.array); /* for the returned array */ return right; } |