/* Global definitions of limits and constants */ #define MAX_LINE_LENGTH 1024 #define MAX_LINE_TOKENS 1024 typedef enum { ArrayTag, FunctionTag, HybridTag, MonadicOpTag, DyadicOpTag, BoundFunctionTag, /* Function with left arg bound */ LParTag, RParTag, LCurlTag, RCurlTag, LBracketTag, RBracketTag } datumTag; typedef enum { AtypeInt, AtypeArray } arrayDataType; /* Data types */ typedef struct Array Array; typedef struct Expr Expr; typedef struct Datum Datum; struct Array { arrayDataType type; int rank; int *shape; int size; int stranded; /* 1 if build directly by stranding */ union { char *rawdata; vlong *intdata; Array **arraydata; }; }; struct Expr { int ntoks; Datum *toks; }; struct Datum { datumTag tag; union { Array *array; int code; Expr expr; }; }; typedef Array* (*fnmonad)(Array*); /* Function prototypes for the different source files */ /* print.c */ Rune *ppdatum(Datum); Rune *ppdatums(Datum *, int); Rune *pparray(Array *); /* lexer.c */ Datum *lexline(Rune *, int *); /* array.c */ Array *mkarray(int, int, int); Array *mkscalarint(vlong); Array *duparray(Array *); int simplearray(Array *); int simplescalar(Array *); /* eval.c */ Datum *eval(Datum *, int *); /* Monadic functions from functions.h */ Array *fnEnclose(Array *); Array *fnNest(Array *); Array *fnRavel(Array *); /* Dyadic functions from functions.h */ Array *fnCatenateFirst(Array *, Array *); /* Global variables */ 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 primhybridnames[]; /* lexer.c */ extern fnmonad monadfunctiondefs[]; /* function.c */