diff options
| author | Keith Packard <keithp@keithp.com> | 2017-11-16 13:02:07 -0800 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2017-11-16 13:02:07 -0800 | 
| commit | bd881a5b85d7cd4fb82127f92f32e089499b50cb (patch) | |
| tree | bf4f5f985e37544b1ee64a65020b809ee994e227 /src/lisp/ao_lisp_cons.c | |
| parent | 50a095fbe828b6ec3159d27930712df6b1b519b4 (diff) | |
altos/lisp: Add non-cons cdr support
The cdr of a cons can be any value; add support for lexing and
printing them.
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/lisp/ao_lisp_cons.c')
| -rw-r--r-- | src/lisp/ao_lisp_cons.c | 25 | 
1 files changed, 19 insertions, 6 deletions
| diff --git a/src/lisp/ao_lisp_cons.c b/src/lisp/ao_lisp_cons.c index d2b60c9a..81a16a7a 100644 --- a/src/lisp/ao_lisp_cons.c +++ b/src/lisp/ao_lisp_cons.c @@ -72,7 +72,7 @@ const struct ao_lisp_type ao_lisp_cons_type = {  struct ao_lisp_cons *ao_lisp_cons_free_list;  struct ao_lisp_cons * -ao_lisp_cons_cons(ao_poly car, struct ao_lisp_cons *cdr) +ao_lisp_cons_cons(ao_poly car, ao_poly cdr)  {  	struct ao_lisp_cons	*cons; @@ -81,18 +81,24 @@ ao_lisp_cons_cons(ao_poly car, struct ao_lisp_cons *cdr)  		ao_lisp_cons_free_list = ao_lisp_poly_cons(cons->cdr);  	} else {  		ao_lisp_poly_stash(0, car); -		ao_lisp_cons_stash(0, cdr); +		ao_lisp_poly_stash(1, cdr);  		cons = ao_lisp_alloc(sizeof (struct ao_lisp_cons));  		car = ao_lisp_poly_fetch(0); -		cdr = ao_lisp_cons_fetch(0); +		cdr = ao_lisp_poly_fetch(1);  		if (!cons)  			return NULL;  	}  	cons->car = car; -	cons->cdr = ao_lisp_cons_poly(cdr); +	cons->cdr = cdr;  	return cons;  } +ao_poly +ao_lisp__cons(ao_poly car, ao_poly cdr) +{ +	return ao_lisp_cons_poly(ao_lisp_cons_cons(car, cdr)); +} +  void  ao_lisp_cons_free(struct ao_lisp_cons *cons)  { @@ -114,8 +120,15 @@ ao_lisp_cons_print(ao_poly c)  		if (!first)  			printf(" ");  		ao_lisp_poly_print(cons->car); -		cons = ao_lisp_poly_cons(cons->cdr); -		first = 0; +		c = cons->cdr; +		if (ao_lisp_poly_type(c) == AO_LISP_CONS) { +			cons = ao_lisp_poly_cons(c); +			first = 0; +		} else { +			printf(" . "); +			ao_lisp_poly_print(c); +			cons = NULL; +		}  	}  	printf(")");  } | 
