All: fix read/print of \\, and \n
[jackhill/mal.git] / c / types.h
1 #ifndef __MAL_TYPES__
2 #define __MAL_TYPES__
3
4 #include <glib.h>
5
6
7 struct MalVal; // pre-declare
8
9
10 // Env (implentation in env.c)
11
12 typedef struct Env {
13 struct Env *outer;
14 GHashTable *table;
15 } Env;
16
17 Env *new_env(Env *outer, struct MalVal* binds, struct MalVal *exprs);
18 Env *env_find(Env *env, struct MalVal *key);
19 struct MalVal *env_get(Env *env, struct MalVal *key);
20 Env *env_set(Env *env, struct MalVal *key, struct MalVal *val);
21
22
23 // Utility functiosn
24 void g_hash_table_print(GHashTable *hash_table);
25 GHashTable *g_hash_table_copy(GHashTable *src_table);
26
27
28 // Errors/exceptions
29
30 extern struct MalVal *mal_error;
31 void _error(const char *fmt, ...);
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
48
49 typedef 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
65 typedef 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
119 extern MalVal mal_nil;
120 extern MalVal mal_true;
121 extern MalVal mal_false;
122
123
124 // Declare functions used internally (by other C code).
125 // Mal visible functions are "exported" in types_ns
126
127 MalVal *malval_new(MalType type, MalVal *metadata);
128 void malval_free(MalVal *mv);
129 MalVal *malval_new_integer(gint64 val);
130 MalVal *malval_new_float(gdouble val);
131 MalVal *malval_new_string(char *val);
132 MalVal *malval_new_symbol(char *val);
133 MalVal *malval_new_keyword(char *val);
134 MalVal *malval_new_list(MalType type, GArray *val);
135 MalVal *malval_new_hash_map(GHashTable *val);
136 MalVal *malval_new_atom(MalVal *val);
137 MalVal *malval_new_function(void *(*func)(void *), int arg_cnt);
138
139 // Numbers
140 #define WRAP_INTEGER_OP(name, op) \
141 static MalVal *int_ ## name(MalVal *a, MalVal *b) { \
142 return malval_new_integer(a->val.intnum op b->val.intnum); \
143 }
144 #define WRAP_INTEGER_CMP_OP(name, op) \
145 static MalVal *int_ ## name(MalVal *a, MalVal *b) { \
146 return a->val.intnum op b->val.intnum ? &mal_true : &mal_false; \
147 }
148
149 // Collections
150 MalVal *_listX(int count, ...);
151 MalVal *_list(MalVal *args);
152 MalVal *_vector(MalVal *args);
153 MalVal *_hash_map(MalVal *args);
154 MalVal *_assoc_BANG(MalVal* hm, MalVal *args);
155 MalVal *_dissoc_BANG(MalVal* hm, MalVal *args);
156
157 MalVal *_apply(MalVal *f, MalVal *el);
158
159 char *_pr_str(MalVal *args, int print_readably);
160
161 MalVal *_slice(MalVal *seq, int start, int end);
162 MalVal *_nth(MalVal *seq, int idx);
163 MalVal *_first(MalVal *seq);
164 MalVal *_rest(MalVal *seq);
165 MalVal *_last(MalVal *seq);
166 int _count(MalVal *obj);
167
168 int _atom_Q(MalVal *exp);
169 int _sequential_Q(MalVal *seq);
170 int _list_Q(MalVal *seq);
171 int _vector_Q(MalVal *seq);
172 int _hash_map_Q(MalVal *seq);
173 int _equal_Q(MalVal *a, MalVal *b);
174
175 MalVal *_map2(MalVal *(*func)(void*, void*), MalVal *lst, void *arg2);
176
177 #endif