diff options
author | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-23 21:16:02 +0000 |
---|---|---|
committer | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-23 21:16:02 +0000 |
commit | 9a938d3ce26b2d3728d791c0f858acdbd50223b5 (patch) | |
tree | a64151c171f0c289847c83367a678fd3252f2f99 /apl9.h | |
parent | 3aa88a917e8c44ab088498dcfc18c48e66ceb243 (diff) |
Rework symbol lookup to use lexical scoping, and implement recursive function call via ∇
Diffstat (limited to 'apl9.h')
-rw-r--r-- | apl9.h | 26 |
1 files changed, 20 insertions, 6 deletions
@@ -67,6 +67,7 @@ typedef struct Symbol Symbol; typedef struct Symtab Symtab; typedef struct QuadnameDef QuadnameDef; typedef struct ErrorHandler ErrorHandler; +typedef struct DfnFrame DfnFrame; struct Array { @@ -178,6 +179,13 @@ struct ErrorHandler jmp_buf jmp; }; +struct DfnFrame +{ + Rune *code; + Symtab *symtab; + DfnFrame *prev; +}; + /* Function prototypes for the different source files */ /* main.c */ Datum *evalline(Rune *, int); @@ -214,9 +222,15 @@ Array *fillelement(Array *); Datum *eval(Statement *, int); /* symbol.c */ -Symbol *getsym(Symtab *, Rune *); -Symtab *newsymtab(void); -void freesymtab(Symtab *); +Symbol *getsym(Rune *); +void initsymtab(void); +DfnFrame *getcurrentdfn(void); +DfnFrame *pushdfnframe(Rune *); +void popdfnframe(void); +vlong globalIO(void); +void globalIOset(vlong); +int globalDIV(void); +void globalDIVset(int); /* memory.c */ void *emalloc(ulong); @@ -271,6 +285,7 @@ Array *fnShape(Array *); Array *fnReverseLast(Array *); Array *fnReverseFirst(Array *); Array *fnTranspose(Array *); +Array *fnSelfRef1(Array *); /* Dyadic functions from function.c */ Array *fnPlus(Array *, Array *); @@ -300,6 +315,7 @@ Array *fnIndex(Array *, Array *); Array *fnCatenateLast(Array *, Array *); Array *fnCatenateFirst(Array *, Array *); Array *fnReshape(Array *, Array *); +Array *fnSelfRef2(Array *, Array *); /* Monadic operators from operators.c */ Array *opEach(Datum *, Array *, Array *); @@ -332,10 +348,8 @@ extern opmonad monadoperatordefs[]; /* operators.c */ extern opdyad dyadoperatordefs[]; /* operators.c */ extern fndyad hybridfunctiondefs[]; /* hybrids.c */ extern opmonad hybridoperatordefs[]; /* hybrids.c */ -extern Symtab *globalsymtab; /* symbol.c */ -extern Symtab *currentsymtab; /* symbol.c */ extern int alloccounts; /* memory.c */ extern QuadnameDef quadnames[]; /* quadnames.c */ extern int printprecision; /* print.c */ extern ErrorHandler globalerror; /* error.c */ -extern Rune *errorstrs[]; /* error.c */
\ No newline at end of file +extern Rune *errorstrs[]; /* error.c */ |