10#ifndef MICROLISP_INTERNAL_H_INCLUDED
11#define MICROLISP_INTERNAL_H_INCLUDED
41_Static_assert(
sizeof(uintptr_t) >= 8,
"microlisp requires a 64-bit target");
45#define M_TAG_MASK ((mvalue)0x7U)
46#define M_TAG_OBJ ((mvalue)0x0U)
47#define M_TAG_FIX ((mvalue)0x1U)
48#define M_TAG_IMM ((mvalue)0x2U)
49#define M_TAG_SYM ((mvalue)0x3U)
53#define M_TAG_OF(v) ((v) & M_TAG_MASK)
55#define M_PAYLOAD(v) ((v) >> 3)
58#define M_IMM_ID_NIL 0U
59#define M_IMM_ID_TRUE 1U
60#define M_IMM_ID_FALSE 2U
61#define M_IMM_ID_EOF 3U
62#define M_IMM_ID_UNDEF 4U
64#define M_MAKE_IMM(id) ((mvalue)(((mvalue)(id) << 3) | M_TAG_IMM))
65#define MV_NIL M_MAKE_IMM(M_IMM_ID_NIL)
66#define MV_TRUE M_MAKE_IMM(M_IMM_ID_TRUE)
67#define MV_FALSE M_MAKE_IMM(M_IMM_ID_FALSE)
68#define MV_EOF M_MAKE_IMM(M_IMM_ID_EOF)
69#define MV_UNDEF M_MAKE_IMM(M_IMM_ID_UNDEF)
72#define M_FIX_MIN ((int64_t) - ((int64_t)1 << 59))
73#define M_FIX_MAX ((int64_t)(((int64_t)1 << 59) - 1))
80 uint64_t u = (uint64_t)x;
86 int64_t s = (int64_t)v;
120 return (uint32_t)(v >> 3);
191 return (
mobj *)(uintptr_t)v;
194 return (
mpair *)(uintptr_t)v;
197 return (
mstring *)(uintptr_t)v;
203 return (
mprim *)(uintptr_t)v;
206 return (
menv *)(uintptr_t)v;
376 uint32_t arity_min, uint32_t arity_max,
mvalue *out);
#define MICROLISP_PRINTF(fmt_idx, vararg_idx)
Definition export.h:60
microlisp_status
Error and status codes returned by every fallible API entry point.
Definition microlisp.h:71
static int ml_is_procedure(mvalue v)
Definition microlisp_internal.h:227
static uint32_t ml_sym_index(mvalue v)
Definition microlisp_internal.h:119
microlisp_status ml_gc_alloc_string(ml_state *s, const uint8_t *bytes, size_t len, mvalue *out)
Definition gc.c:92
#define M_TAG_OF(v)
Definition microlisp_internal.h:53
microlisp_status ml_env_define(ml_state *s, mvalue env, mvalue name, mvalue value)
Definition env.c:54
#define MV_TRUE
Definition microlisp_internal.h:66
const char * ml_sym_name(const ml_state *s, mvalue sym, size_t *out_len)
Definition symtab.c:95
static int ml_is_obj_type(mvalue v, mobj_type t)
Definition microlisp_internal.h:209
static int ml_is_pair(mvalue v)
Definition microlisp_internal.h:212
static mpair * ml_as_pair(mvalue v)
Definition microlisp_internal.h:193
mobj_type
Definition microlisp_internal.h:131
@ OBJ_PRIMITIVE
Definition microlisp_internal.h:135
@ OBJ_PAIR
Definition microlisp_internal.h:132
@ OBJ_STRING
Definition microlisp_internal.h:133
@ OBJ_ENV
Definition microlisp_internal.h:136
@ OBJ_CLOSURE
Definition microlisp_internal.h:134
static int ml_is_obj(mvalue v)
Definition microlisp_internal.h:91
static int ml_is_prim(mvalue v)
Definition microlisp_internal.h:221
static int ml_is_sym(mvalue v)
Definition microlisp_internal.h:100
static int ml_is_fix(mvalue v)
Definition microlisp_internal.h:94
microlisp_status ml_value_equal(ml_state *s, mvalue a, mvalue b, int *out_equal)
Definition value.c:35
void * ml_raw_alloc(ml_state *s, size_t size)
Definition gc.c:34
void ml_gc_restore(ml_state *s, size_t saved)
Definition gc.c:203
static int ml_is_imm(mvalue v)
Definition microlisp_internal.h:97
microlisp_status ml_read(ml_state *s, ml_reader *r, mvalue *out)
Definition reader.c:473
void ml_gc_free_all(ml_state *s)
Definition gc.c:391
static mvalue ml_make_sym(uint32_t idx)
Definition microlisp_internal.h:116
void ml_set_error(ml_state *s, size_t line, size_t column, const char *fmt,...) MICROLISP_PRINTF(4
microlisp_status ml_gc_protect(ml_state *s, mvalue v)
Definition gc.c:174
static int ml_is_closure(mvalue v)
Definition microlisp_internal.h:218
microlisp_status ml_primitives_install(ml_state *s, mvalue env)
Definition primitives.c:533
static int ml_is_bool(mvalue v)
Definition microlisp_internal.h:106
static int ml_is_nil(mvalue v)
Definition microlisp_internal.h:103
#define M_TAG_IMM
Definition microlisp_internal.h:48
microlisp_status ml_sym_intern(ml_state *s, const char *name, size_t len, mvalue *out)
Definition symtab.c:34
void ml_raw_free(ml_state *s, void *p)
Definition gc.c:41
void ml_gc_collect(ml_state *s)
Definition gc.c:352
static size_t ml_gc_savepoint(const ml_state *s)
Definition microlisp_internal.h:386
static mvalue ml_make_bool(int b)
Definition microlisp_internal.h:113
uintptr_t mvalue
Definition microlisp_internal.h:43
static int ml_is_string(mvalue v)
Definition microlisp_internal.h:215
void void ml_clear_error(ml_state *s)
Definition state.c:46
microlisp_status ml_gc_alloc_primitive(ml_state *s, const char *name, ml_prim_fn fn, uint32_t arity_min, uint32_t arity_max, mvalue *out)
Definition gc.c:134
int ml_value_eq(mvalue a, mvalue b)
Definition value.c:19
#define MV_NIL
Definition microlisp_internal.h:65
static int64_t ml_fix_int(mvalue v)
Definition microlisp_internal.h:85
microlisp_status ml_gc_alloc_env(ml_state *s, mvalue parent, mvalue *out)
Definition gc.c:152
static menv * ml_as_env(mvalue v)
Definition microlisp_internal.h:205
microlisp_status(* ml_out_fn)(const void *bytes, size_t len, void *user)
Definition microlisp_internal.h:438
static int ml_truthy(mvalue v)
Definition microlisp_internal.h:109
microlisp_status ml_env_lookup(const ml_state *s, mvalue env, mvalue name, mvalue *out)
Definition env.c:102
int ml_value_eqv(mvalue a, mvalue b)
Definition value.c:23
static mobj * ml_as_obj(mvalue v)
Definition microlisp_internal.h:190
static mstring * ml_as_string(mvalue v)
Definition microlisp_internal.h:196
static mclosure * ml_as_closure(mvalue v)
Definition microlisp_internal.h:199
microlisp_status ml_eval(ml_state *s, mvalue form, mvalue env, mvalue *out)
Definition eval.c:670
void ml_gc_unprotect(ml_state *s, size_t n)
Definition gc.c:196
microlisp_status ml_print_to_alloc(ml_state *s, mvalue v, int write_style, char **out_bytes, size_t *out_len)
Definition printer.c:287
microlisp_status ml_env_set(ml_state *s, mvalue env, mvalue name, mvalue value)
Definition env.c:83
#define MV_FALSE
Definition microlisp_internal.h:67
static mvalue ml_make_fix(int64_t x)
Definition microlisp_internal.h:76
#define M_TAG_OBJ
Definition microlisp_internal.h:46
microlisp_status ml_gc_alloc_closure(ml_state *s, mvalue env, mvalue params, mvalue body, mvalue *out)
Definition gc.c:115
#define M_TAG_SYM
Definition microlisp_internal.h:49
microlisp_status ml_gc_alloc_pair(ml_state *s, mvalue car, mvalue cdr, mvalue *out)
Definition gc.c:77
static mprim * ml_as_prim(mvalue v)
Definition microlisp_internal.h:202
static int ml_is_env(mvalue v)
Definition microlisp_internal.h:224
#define M_TAG_FIX
Definition microlisp_internal.h:47
microlisp_status(* ml_prim_fn)(struct microlisp_state *state, size_t argc, const mvalue *argv, mvalue *out)
Definition microlisp_internal.h:169
microlisp_status ml_print(ml_state *s, mvalue v, int write_style, ml_out_fn out, void *user)
Definition printer.c:241
Definition microlisp_internal.h:158
mvalue body
Non-empty list of body forms.
Definition microlisp_internal.h:162
mobj h
Definition microlisp_internal.h:159
mvalue params
Proper or improper list of parameter symbols.
Definition microlisp_internal.h:161
mvalue env
Environment captured at lambda creation.
Definition microlisp_internal.h:160
int variadic
1 if params ends in a dotted rest-arg.
Definition microlisp_internal.h:163
uint32_t arity_min
Required positional params.
Definition microlisp_internal.h:164
Definition microlisp_internal.h:180
mvalue parent
Enclosing env, or MV_NIL for the top-level.
Definition microlisp_internal.h:182
mvalue * values
Parallel array of bound values.
Definition microlisp_internal.h:186
size_t capacity
Definition microlisp_internal.h:184
size_t count
Definition microlisp_internal.h:183
mvalue * names
Allocated array of symbol values (M_TAG_SYM).
Definition microlisp_internal.h:185
mobj h
Definition microlisp_internal.h:181
Caller-supplied allocator.
Definition microlisp.h:163
Definition microlisp_internal.h:267
FILE * output
Definition microlisp_internal.h:352
size_t print_depth
Definition microlisp_internal.h:339
int allocator_provided
1 if user provided one; 0 means malloc.
Definition microlisp_internal.h:269
size_t max_print_depth
Definition microlisp_internal.h:338
size_t max_eval_depth
Definition microlisp_internal.h:330
mvalue sym_set_bang
Definition microlisp_internal.h:309
mvalue sym_else
Definition microlisp_internal.h:317
size_t gc_protect_cap
Definition microlisp_internal.h:282
size_t max_read_depth
Definition microlisp_internal.h:323
mvalue sym_if
Definition microlisp_internal.h:306
size_t max_equal_depth
Definition microlisp_internal.h:345
mvalue sym_quote
Definition microlisp_internal.h:305
ml_error last_error
Definition microlisp_internal.h:355
mobj ** gc_marklist
Definition microlisp_internal.h:295
size_t gc_marklist_cap
Definition microlisp_internal.h:297
mvalue sym_lambda
Definition microlisp_internal.h:308
mvalue sym_or
Definition microlisp_internal.h:315
mvalue sym_letrec
Definition microlisp_internal.h:312
mvalue sym_begin
Definition microlisp_internal.h:313
size_t gc_threshold
Trigger collection when live > threshold.
Definition microlisp_internal.h:274
mobj * gc_head
Head of "every heap object" list.
Definition microlisp_internal.h:272
int gc_stress
Definition microlisp_internal.h:287
size_t eval_depth
Definition microlisp_internal.h:331
mvalue sym_cond
Definition microlisp_internal.h:316
ml_symtab symtab
Definition microlisp_internal.h:300
size_t gc_protect_count
Definition microlisp_internal.h:281
size_t equal_depth
Definition microlisp_internal.h:346
mvalue sym_define
Definition microlisp_internal.h:307
size_t gc_live_objects
Live object count.
Definition microlisp_internal.h:273
mvalue toplevel_env
Definition microlisp_internal.h:320
mvalue sym_let_star
Definition microlisp_internal.h:311
mvalue * gc_protect
Definition microlisp_internal.h:280
microlisp_allocator allocator
Resolved (never partial).
Definition microlisp_internal.h:268
size_t gc_marklist_count
Definition microlisp_internal.h:296
mvalue sym_let
Definition microlisp_internal.h:310
mvalue sym_and
Definition microlisp_internal.h:314
Definition microlisp_internal.h:257
size_t column
1-based; 0 = "no position."
Definition microlisp_internal.h:260
size_t line
1-based; 0 = "no position."
Definition microlisp_internal.h:259
char message[256]
Definition microlisp_internal.h:258
Definition microlisp_internal.h:423
size_t pos
Definition microlisp_internal.h:426
size_t len
Definition microlisp_internal.h:425
size_t depth
Current paren nesting.
Definition microlisp_internal.h:429
size_t column
Definition microlisp_internal.h:428
size_t line
Definition microlisp_internal.h:427
const uint8_t * input
Definition microlisp_internal.h:424
Definition microlisp_internal.h:242
char * name
NUL-terminated, owned.
Definition microlisp_internal.h:243
size_t len
Definition microlisp_internal.h:244
Definition microlisp_internal.h:247
ml_symtab_entry * entries
Definition microlisp_internal.h:248
size_t capacity
Definition microlisp_internal.h:250
size_t count
Definition microlisp_internal.h:249
Definition microlisp_internal.h:139
mobj_type type
Definition microlisp_internal.h:140
struct mobj * next
Linked-list of all live heap objects.
Definition microlisp_internal.h:142
uint8_t marked
Set during GC mark phase.
Definition microlisp_internal.h:141
Definition microlisp_internal.h:145
mobj h
Definition microlisp_internal.h:146
mvalue cdr
Definition microlisp_internal.h:148
mvalue car
Definition microlisp_internal.h:147
Definition microlisp_internal.h:172
uint32_t arity_min
Minimum required args.
Definition microlisp_internal.h:176
mobj h
Definition microlisp_internal.h:173
const char * name
Static string; not owned.
Definition microlisp_internal.h:174
uint32_t arity_max
UINT32_MAX means "variadic".
Definition microlisp_internal.h:177
ml_prim_fn fn
Definition microlisp_internal.h:175
Definition microlisp_internal.h:151
uint8_t bytes[]
Definition microlisp_internal.h:155
size_t len
Definition microlisp_internal.h:153
mobj h
Definition microlisp_internal.h:152