summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c40
1 files changed, 27 insertions, 13 deletions
diff --git a/eval.c b/eval.c
index 6b12245..3958a98 100644
--- a/eval.c
+++ b/eval.c
@@ -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;
}