summaryrefslogtreecommitdiff
path: root/symbol.c
diff options
context:
space:
mode:
Diffstat (limited to 'symbol.c')
-rw-r--r--symbol.c122
1 files changed, 121 insertions, 1 deletions
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