Commit | Line | Data |
---|---|---|
31690700 JM |
1 | #ifndef __MAL_TYPES__ |
2 | #define __MAL_TYPES__ | |
3 | ||
4 | #include <glib.h> | |
5 | ||
31690700 JM |
6 | |
7 | struct MalVal; // pre-declare | |
ea81a808 JM |
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); | |
b8ee29b2 JM |
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); | |
ea81a808 JM |
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 | ||
31690700 | 30 | extern struct MalVal *mal_error; |
ea81a808 | 31 | void _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 |
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 | ||
31690700 JM |
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); | |
b81b2a7e | 128 | void malval_free(MalVal *mv); |
31690700 JM |
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); | |
b8ee29b2 | 133 | MalVal *malval_new_keyword(char *val); |
31690700 | 134 | MalVal *malval_new_list(MalType type, GArray *val); |
ea81a808 JM |
135 | MalVal *malval_new_hash_map(GHashTable *val); |
136 | MalVal *malval_new_atom(MalVal *val); | |
8cb5cda4 | 137 | MalVal *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 |
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); | |
31690700 | 156 | |
ea81a808 | 157 | MalVal *_apply(MalVal *f, MalVal *el); |
31690700 JM |
158 | |
159 | char *_pr_str(MalVal *args, int print_readably); | |
160 | ||
31690700 JM |
161 | MalVal *_slice(MalVal *seq, int start, int end); |
162 | MalVal *_nth(MalVal *seq, int idx); | |
8cb5cda4 JM |
163 | MalVal *_first(MalVal *seq); |
164 | MalVal *_rest(MalVal *seq); | |
165 | MalVal *_last(MalVal *seq); | |
b81b2a7e LB |
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); | |
31690700 JM |
174 | |
175 | MalVal *_map2(MalVal *(*func)(void*, void*), MalVal *lst, void *arg2); | |
176 | ||
31690700 | 177 | #endif |