vb: add seq and string?
[jackhill/mal.git] / c / types.h
CommitLineData
31690700
JM
1#ifndef __MAL_TYPES__
2#define __MAL_TYPES__
3
4#include <glib.h>
5
31690700
JM
6
7struct MalVal; // pre-declare
ea81a808
JM
8
9
10// Env (implentation in env.c)
11
12typedef struct Env {
13 struct Env *outer;
14 GHashTable *table;
15} Env;
16
17Env *new_env(Env *outer, struct MalVal* binds, struct MalVal *exprs);
b8ee29b2
JM
18Env *env_find(Env *env, struct MalVal *key);
19struct MalVal *env_get(Env *env, struct MalVal *key);
20Env *env_set(Env *env, struct MalVal *key, struct MalVal *val);
ea81a808
JM
21
22
23// Utility functiosn
24void g_hash_table_print(GHashTable *hash_table);
25GHashTable *g_hash_table_copy(GHashTable *src_table);
26
27
28// Errors/exceptions
29
31690700 30extern struct MalVal *mal_error;
ea81a808 31void _error(const char *fmt, ...);
31690700
JM
32
33#define abort(format, ...) \
34 { _error(format, ##__VA_ARGS__); return NULL; }
35
36#define assert(test, format, ...) \
37 if (!(test)) { \
38 _error(format, ##__VA_ARGS__); \
39 return NULL; \
40 }
41
42#define assert_type(mv, typ, format, ...) \
43 if (!(mv->type & (typ))) { \
44 _error(format, ##__VA_ARGS__); \
45 return NULL; \
46 }
47
ea81a808 48
31690700
JM
49typedef enum {
50 MAL_NIL = 1,
51 MAL_TRUE = 2,
52 MAL_FALSE = 4,
53 MAL_INTEGER = 8,
54 MAL_FLOAT = 16,
55 MAL_SYMBOL = 32,
56 MAL_STRING = 64,
57 MAL_LIST = 128,
58 MAL_VECTOR = 256,
59 MAL_HASH_MAP = 512,
60 MAL_ATOM = 1024,
61 MAL_FUNCTION_C = 2048,
62 MAL_FUNCTION_MAL = 4096,
63} MalType;
64
31690700
JM
65typedef struct MalVal {
66 MalType type;
67 struct MalVal *metadata;
68 union {
69 gint64 intnum;
70 gdouble floatnum;
71 char *string;
72 GArray *array;
73 GHashTable *hash_table;
74 struct MalVal *atom_val;
75 void *(*f0) ();
76 void *(*f1) (void*);
77 void *(*f2) (void*,void*);
78 void *(*f3) (void*,void*,void*);
79 void *(*f4) (void*,void*,void*,void*);
80 void *(*f5) (void*,void*,void*,void*,void*);
81 void *(*f6) (void*,void*,void*,void*,void*,void*);
82 void *(*f7) (void*,void*,void*,void*,void*,void*,void*);
83 void *(*f8) (void*,void*,void*,void*,void*,void*,void*,void*);
84 void *(*f9) (void*,void*,void*,void*,void*,void*,void*,void*,void*);
85 void *(*f10)(void*,void*,void*,void*,void*,void*,void*,void*,void*,void*);
86 void *(*f11)(void*,void*,void*,void*,void*,void*,void*,void*,void*,void*,
87 void*);
88 void *(*f12)(void*,void*,void*,void*,void*,void*,void*,void*,void*,void*,
89 void*,void*);
90 void *(*f13)(void*,void*,void*,void*,void*,void*,void*,void*,void*,void*,
91 void*,void*,void*);
92 void *(*f14)(void*,void*,void*,void*,void*,void*,void*,void*,void*,void*,
93 void*,void*,void*,void*);
94 void *(*f15)(void*,void*,void*,void*,void*,void*,void*,void*,void*,void*,
95 void*,void*,void*,void*,void*);
96 void *(*f16)(void*,void*,void*,void*,void*,void*,void*,void*,void*,void*,
97 void*,void*,void*,void*,void*,void*);
98 void *(*f17)(void*,void*,void*,void*,void*,void*,void*,void*,void*,void*,
99 void*,void*,void*,void*,void*,void*,void*);
100 void *(*f18)(void*,void*,void*,void*,void*,void*,void*,void*,void*,void*,
101 void*,void*,void*,void*,void*,void*,void*,void*);
102 void *(*f19)(void*,void*,void*,void*,void*,void*,void*,void*,void*,void*,
103 void*,void*,void*,void*,void*,void*,void*,void*,void*);
104 void *(*f20)(void*,void*,void*,void*,void*,void*,void*,void*,void*,void*,
105 void*,void*,void*,void*,void*,void*,void*,void*,void*,void*);
106 struct {
107 struct MalVal *(*evaluator)(struct MalVal *, Env *);
108 struct MalVal *args;
109 struct MalVal *body;
110 struct Env *env;
111 } func;
112 } val;
113 int func_arg_cnt;
114 int ismacro;
115} MalVal;
116
117// Constants
118
119extern MalVal mal_nil;
120extern MalVal mal_true;
121extern MalVal mal_false;
122
123
124// Declare functions used internally (by other C code).
125// Mal visible functions are "exported" in types_ns
126
127MalVal *malval_new(MalType type, MalVal *metadata);
b81b2a7e 128void malval_free(MalVal *mv);
31690700
JM
129MalVal *malval_new_integer(gint64 val);
130MalVal *malval_new_float(gdouble val);
131MalVal *malval_new_string(char *val);
132MalVal *malval_new_symbol(char *val);
b8ee29b2 133MalVal *malval_new_keyword(char *val);
31690700 134MalVal *malval_new_list(MalType type, GArray *val);
ea81a808
JM
135MalVal *malval_new_hash_map(GHashTable *val);
136MalVal *malval_new_atom(MalVal *val);
8cb5cda4 137MalVal *malval_new_function(void *(*func)(void *), int arg_cnt);
31690700 138
8cb5cda4
JM
139// Numbers
140#define WRAP_INTEGER_OP(name, op) \
b81b2a7e 141 static MalVal *int_ ## name(MalVal *a, MalVal *b) { \
8cb5cda4
JM
142 return malval_new_integer(a->val.intnum op b->val.intnum); \
143 }
144#define WRAP_INTEGER_CMP_OP(name, op) \
b81b2a7e 145 static MalVal *int_ ## name(MalVal *a, MalVal *b) { \
8cb5cda4
JM
146 return a->val.intnum op b->val.intnum ? &mal_true : &mal_false; \
147 }
148
149// Collections
ea81a808
JM
150MalVal *_listX(int count, ...);
151MalVal *_list(MalVal *args);
152MalVal *_vector(MalVal *args);
153MalVal *_hash_map(MalVal *args);
154MalVal *_assoc_BANG(MalVal* hm, MalVal *args);
155MalVal *_dissoc_BANG(MalVal* hm, MalVal *args);
31690700 156
ea81a808 157MalVal *_apply(MalVal *f, MalVal *el);
31690700
JM
158
159char *_pr_str(MalVal *args, int print_readably);
160
31690700
JM
161MalVal *_slice(MalVal *seq, int start, int end);
162MalVal *_nth(MalVal *seq, int idx);
8cb5cda4
JM
163MalVal *_first(MalVal *seq);
164MalVal *_rest(MalVal *seq);
165MalVal *_last(MalVal *seq);
b81b2a7e
LB
166int _count(MalVal *obj);
167
168int _atom_Q(MalVal *exp);
169int _sequential_Q(MalVal *seq);
170int _list_Q(MalVal *seq);
171int _vector_Q(MalVal *seq);
172int _hash_map_Q(MalVal *seq);
173int _equal_Q(MalVal *a, MalVal *b);
31690700
JM
174
175MalVal *_map2(MalVal *(*func)(void*, void*), MalVal *lst, void *arg2);
176
31690700 177#endif