From 468e0f6313fb620bd2f7ea469178fe02412ddc31 Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Mon, 24 Jan 2022 21:18:01 +0000 Subject: =?UTF-8?q?Implement=20=E2=8D=BA=E2=8D=B5=E2=8D=B6=E2=8D=B9=20as?= =?UTF-8?q?=20get-set=20variables,=20which=20may=20make=20it=20easier=20to?= =?UTF-8?q?=20do=20TCO=20later.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- symbol.c | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 121 insertions(+), 1 deletion(-) (limited to 'symbol.c') diff --git a/symbol.c b/symbol.c index e10ee7a..2edb572 100644 --- a/symbol.c +++ b/symbol.c @@ -10,6 +10,13 @@ DfnFrame *currentdfn; Symtab *newsymtab(void); void freesymtab(Symtab *); +Datum *getalpha(void); +Datum *getomega(void); +Datum *getalphao(void); +Datum *getomegao(void); +void setalpha(Datum); +void setsyntaxerr(Datum); + Symbol * getsym(Rune *name, int fresh) { @@ -70,6 +77,26 @@ void initsymtab(void) { globalsymtab = newsymtab(); + Symbol *s; + s = getsym(L"⍺", 1); + s->getfn = getalpha; + s->setfn = setalpha; + s->undefined = 0; + + s = getsym(L"⍵", 1); + s->getfn = getomega; + s->setfn = setsyntaxerr; + s->undefined = 0; + + s = getsym(L"⍶", 1); + s->getfn = getalphao; + s->setfn = setsyntaxerr; + s->undefined = 0; + + s = getsym(L"⍹", 1); + s->getfn = getomegao; + s->setfn = setsyntaxerr; + s->undefined = 0; } DfnFrame * @@ -79,11 +106,20 @@ getcurrentdfn(void) } DfnFrame * -pushdfnframe(Rune *code) +pushdfnframe(Rune *code, Datum *lefto, Datum *righto, Array *left, Array *right) { DfnFrame *new = malloc(sizeof(DfnFrame)); new->code = code; new->symtab = newsymtab(); + new->lefto = lefto; + new->righto = righto; + if(left){ + new->left = mallocz(sizeof(Datum), 1); + new->left->tag = ArrayTag; + new->left->array = left; + }else + new->left = nil; + new->right = right; new->prev = currentdfn; currentdfn = new; return new; @@ -138,4 +174,88 @@ globalDIVset(int div) currentdfn->symtab->div = div; else globalsymtab->div = div; +} + +/* getters and setters for ⍺⍵⍶⍹ */ +Datum * +getalpha(void) +{ + DfnFrame *dfn = getcurrentdfn(); + Datum *res = nil; + if(dfn == nil) + throwerror(nil, ESyntax); + else{ + res = malloc(sizeof(Datum)); + *res = *dfn->left; + if(res->tag == ArrayTag) + incref(res->array); + return res; + } + return res; +} + +Datum * +getomega(void) +{ + DfnFrame *dfn = getcurrentdfn(); + Datum *res = nil; + if(dfn == nil) + throwerror(nil, ESyntax); + else{ + res = mallocz(sizeof(Datum), 1); + res->tag = ArrayTag; + res->array = dfn->right; + incref(res->array); + } + return res; +} + +Datum * +getalphao(void) +{ + DfnFrame *dfn = getcurrentdfn(); + Datum *res = nil; + if(dfn == nil) + throwerror(nil, ESyntax); + else{ + res = malloc(sizeof(Datum)); + *res = *dfn->lefto; + if(res->tag == ArrayTag) + incref(res->array); + } + return res; +} + +Datum * +getomegao(void) +{ + DfnFrame *dfn = getcurrentdfn(); + Datum *res = nil; + if(dfn == nil) + throwerror(nil, ESyntax); + else{ + res = malloc(sizeof(Datum)); + *res = *dfn->righto; + if(res->tag == ArrayTag) + incref(res->array); + } + return res; +} + +void +setalpha(Datum new) +{ + DfnFrame *dfn = getcurrentdfn(); + if(dfn == nil) + throwerror(nil, ESyntax); + if(dfn->left == nil){ + dfn->left = malloc(sizeof(Datum)); + *dfn->left = new; + } +} + +void +setsyntaxerr(Datum) +{ + throwerror(nil, ESyntax); } \ No newline at end of file -- cgit v1.2.3