diff options
| author | Keith Packard <keithp@keithp.com> | 2016-11-09 16:22:43 -0800 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2017-02-20 11:16:50 -0800 | 
| commit | 417161dbb36323b5a6572859dedad02ca92fc65c (patch) | |
| tree | e8d8476ec82339bb655dbd0c9d1f95cba90caadc /src/lisp/ao_lisp_poly.c | |
| parent | 0ee44c8e4bf5dabe6a97bf76b366c8b767c387f8 (diff) | |
altos/lisp: Clean up OS integration bits, add defun
Provide an abstraction for the OS interface so that it
can build more cleanly on Linux and AltOS. Add defun macro.
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/lisp/ao_lisp_poly.c')
| -rw-r--r-- | src/lisp/ao_lisp_poly.c | 85 | 
1 files changed, 62 insertions, 23 deletions
| diff --git a/src/lisp/ao_lisp_poly.c b/src/lisp/ao_lisp_poly.c index c6ca0a97..bfd75ae3 100644 --- a/src/lisp/ao_lisp_poly.c +++ b/src/lisp/ao_lisp_poly.c @@ -14,34 +14,73 @@  #include "ao_lisp.h" -/* +#if 0 +#define DBG(...) printf (__VA_ARGS__) +#else +#define DBG(...) +#endif -static const struct ao_lisp_builtin builtin_plus = { -	.type = AO_LISP_BUILTIN, -	.func = ao_lisp_plus, -	.name = "+" +struct ao_lisp_funcs { +	void (*print)(ao_poly); +	void (*patom)(ao_poly);  }; -static const struct ao_lisp_atom atom_plus = { -	.type = AO_LISP_ATOM, -	.val = AO_LISP_OTHER_POLY(&builtin_plus), -	.next = AO_LISP_ATOM_CONST, -	.name = "plus" +static const struct ao_lisp_funcs ao_lisp_funcs[AO_LISP_NUM_TYPE] = { +	[AO_LISP_CONS] = { +		.print = ao_lisp_cons_print, +		.patom = ao_lisp_cons_patom, +	}, +	[AO_LISP_STRING] = { +		.print = ao_lisp_string_print, +		.patom = ao_lisp_string_patom, +	}, +	[AO_LISP_INT] = { +		.print = ao_lisp_int_print, +		.patom = ao_lisp_int_print, +	}, +	[AO_LISP_ATOM] = { +		.print = ao_lisp_atom_print, +		.patom = ao_lisp_atom_print, +	}, +	[AO_LISP_BUILTIN] = { +		.print = ao_lisp_builtin_print, +		.patom = ao_lisp_builtin_print, +	}, +	[AO_LISP_FRAME] = { +		.print = ao_lisp_frame_print, +		.patom = ao_lisp_frame_print, +	}, +	[AO_LISP_LAMBDA] = { +		.print = ao_lisp_lambda_print, +		.patom = ao_lisp_lambda_print, +	},  }; -static const struct ao_lisp_builtin builtin_minus = { -	.type = AO_LISP_BUILTIN, -	.func = ao_lisp_minus -}; +static const struct ao_lisp_funcs * +funcs(ao_poly p) +{ +	uint8_t	type = ao_lisp_poly_type(p); -static const struct ao_lisp_builtin builtin_times = { -	.type = AO_LISP_BUILTIN, -	.func = ao_lisp_times -}; +	if (type < AO_LISP_NUM_TYPE) +		return &ao_lisp_funcs[type]; +	return NULL; +} +void +ao_lisp_poly_print(ao_poly p) +{ +	const struct ao_lisp_funcs *f = funcs(p); + +	if (f && f->print) +		f->print(p); +} + +void +ao_lisp_poly_patom(ao_poly p) +{ +	const struct ao_lisp_funcs *f = funcs(p); + +	if (f && f->patom) +		f->patom(p); +} -const struct ao_lisp_atom const *ao_lisp_builtins[] = { -	&atom_plus, -	0 -}; -*/ | 
