diff options
Diffstat (limited to 'apl9.h')
-rw-r--r-- | apl9.h | 48 |
1 files changed, 41 insertions, 7 deletions
@@ -27,13 +27,21 @@ typedef enum typedef enum { + OperatortypeDop, + OperatortypePrim, +} operatorType; + +typedef enum +{ FunctypeDfn, FunctypePrim, + FunctypeOp, } functionType; /* Data types */ typedef struct Array Array; typedef struct Statement Statement; +typedef struct Operator Operator; typedef struct Function Function; typedef struct Datum Datum; typedef struct Symbol Symbol; @@ -61,12 +69,25 @@ struct Statement Statement *next; }; +struct Operator +{ + operatorType type; + int dyadic; + union { + int code; + Rune *dop; + }; + Datum *left; + Datum *right; +}; + struct Function { functionType type; union { int code; Rune *dfn; + Operator operator; }; Array *left; }; @@ -79,6 +100,7 @@ struct Datum Array *array; Statement stmt; Function func; + Operator operator; Symbol *symbol; }; }; @@ -98,6 +120,8 @@ struct Symtab typedef Array* (*fnmonad)(Array*); typedef Array* (*fndyad)(Array*, Array*); +typedef Array* (*opmonad)(Datum *, Array *, Array *); +typedef Array* (*opdyad)(Datum *, Datum *, Array *, Array *); /* Function prototypes for the different source files */ /* main.c */ @@ -107,6 +131,7 @@ Datum *evalline(Rune *); Rune *ppdatum(Datum); Rune *ppdatums(Datum *, int); Rune *pparray(Array *); +Rune *ppoperator(Operator); /* lexer.c */ Statement *lexline(Rune *); @@ -133,7 +158,10 @@ Array *allocarray(int, int, int); void freearray(Array *); void incref(Array *); -/* Monadic functions from functions.h */ +/* functions.c */ +Array *runfunc(Function, Array *,Array *); + +/* Monadic functions from function.c */ Array *fnSame(Array *); Array *fnTally(Array *); Array *fnEnclose(Array *); @@ -142,7 +170,7 @@ Array *fnIndexGenerator(Array *); Array *fnRavel(Array *); Array *fnShape(Array *); -/* Dyadic functions from functions.h */ +/* Dyadic functions from function.c */ Array *fnPlus(Array *, Array *); Array *fnMinus(Array *, Array *); Array *fnTimes(Array *, Array *); @@ -154,16 +182,22 @@ Array *fnRight(Array *, Array *); Array *fnCatenateFirst(Array *, Array *); Array *fnReshape(Array *, Array *); +/* Monadic operators from operators.c */ +Array *opSwitch(Datum *, Array *, Array *); +Array *opOver(Datum *, Datum *, Array *, Array *); + /* Global variables */ extern int traceeval; /* eval.c */ extern Rune *errormsg; /* eval.c */ extern int datasizes[]; /* array.c */ -extern Rune primfuncnames[]; /* function.c */ -extern Rune primmonopnames[]; /* lexer.c */ -extern Rune primdyadopnames[]; /* lexer.c */ +extern Rune primfuncnames[]; /* functions.c */ +extern Rune primmonopnames[]; /* operators.c */ +extern Rune primdyadopnames[]; /* operators.c */ extern Rune primhybridnames[]; /* lexer.c */ -extern fnmonad monadfunctiondefs[]; /* function.c */ -extern fndyad dyadfunctiondefs[]; /* function.c */ +extern fnmonad monadfunctiondefs[]; /* functions.c */ +extern fndyad dyadfunctiondefs[]; /* functions.c */ +extern opmonad monadoperatordefs[]; /* operators.c */ +extern opdyad dyadoperatordefs[]; /* operators.c */ extern Symtab *globalsymtab; /* symbol.c */ extern Symtab *currentsymtab; /* symbol.c */ extern int alloccounts; /* memory.c */
\ No newline at end of file |