7 struct MalVal
; // pre-declare
10 // Env (implentation in env.c)
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
);
24 void g_hash_table_print(GHashTable
*hash_table
);
25 GHashTable
*g_hash_table_copy(GHashTable
*src_table
);
30 extern struct MalVal
*mal_error
;
31 void _error(const char *fmt
, ...);
33 #define abort(format, ...) \
34 { _error(format, ##__VA_ARGS__); return NULL; }
36 #define assert(test, format, ...) \
38 _error(format, ##__VA_ARGS__); \
42 #define assert_type(mv, typ, format, ...) \
43 if (!(mv->type & (typ))) { \
44 _error(format, ##__VA_ARGS__); \
61 MAL_FUNCTION_C
= 2048,
62 MAL_FUNCTION_MAL
= 4096,
65 typedef struct MalVal
{
67 struct MalVal
*metadata
;
73 GHashTable
*hash_table
;
74 struct MalVal
*atom_val
;
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*,
88 void *(*f12
)(void*,void*,void*,void*,void*,void*,void*,void*,void*,void*,
90 void *(*f13
)(void*,void*,void*,void*,void*,void*,void*,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*);
107 struct MalVal
*(*evaluator
)(struct MalVal
*, Env
*);
119 extern MalVal mal_nil
;
120 extern MalVal mal_true
;
121 extern MalVal mal_false
;
124 // Declare functions used internally (by other C code).
125 // Mal visible functions are "exported" in types_ns
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
);
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); \
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; \
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
);
157 MalVal
*_apply(MalVal
*f
, MalVal
*el
);
159 char *_pr_str(MalVal
*args
, int print_readably
);
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
);
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
);
175 MalVal
*_map2(MalVal
*(*func
)(void*, void*), MalVal
*lst
, void *arg2
);