summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apl9.h3
-rw-r--r--eval.c41
-rw-r--r--lexer.c4
-rw-r--r--main.c1
-rw-r--r--print.c4
-rw-r--r--quadnames.c22
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("<not printable %d>", 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;