summaryrefslogtreecommitdiff
path: root/apl9.h
blob: bc6f894a6fc9ee002fcca4b1fb902e4d9663e465 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/* 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 *fnTally(Array *);
Array *fnEnclose(Array *);
Array *fnNest(Array *);
Array *fnRavel(Array *);
Array *fnShape(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 */