diff options
| author | Keith Packard <keithp@keithp.com> | 2017-11-17 22:14:19 -0800 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2017-11-17 22:14:19 -0800 | 
| commit | e1acf5eb12aceda7aa838df031c1da1129d0fa5d (patch) | |
| tree | e0fe6c04b9f3f654e246616a78d1278e5d6c3cf5 /src/lisp/ao_lisp_cons.c | |
| parent | a4e18a13029cc7b16b2ed9da84d6e606bc725ac3 (diff) | |
altos/lisp: Add apply
And all of the library routines that use it, map, string-map and friends.
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 | 30 | 
1 files changed, 21 insertions, 9 deletions
| diff --git a/src/lisp/ao_lisp_cons.c b/src/lisp/ao_lisp_cons.c index 81a16a7a..8d607372 100644 --- a/src/lisp/ao_lisp_cons.c +++ b/src/lisp/ao_lisp_cons.c @@ -19,10 +19,16 @@ static void cons_mark(void *addr)  	struct ao_lisp_cons	*cons = addr;  	for (;;) { +		ao_poly cdr = cons->cdr; +  		ao_lisp_poly_mark(cons->car, 1); -		cons = ao_lisp_poly_cons(cons->cdr); -		if (!cons) +		if (!cdr)  			break; +		if (ao_lisp_poly_type(cdr) != AO_LISP_CONS) { +			ao_lisp_poly_mark(cdr, 1); +			break; +		} +		cons = ao_lisp_poly_cons(cdr);  		if (ao_lisp_mark_memory(&ao_lisp_cons_type, cons))  			break;  	} @@ -42,23 +48,29 @@ static void cons_move(void *addr)  		return;  	for (;;) { -		struct ao_lisp_cons	*cdr; -		int			ret; +		ao_poly			cdr; +		struct ao_lisp_cons	*c; +		int	ret;  		MDBG_MOVE("cons_move start %d (%d, %d)\n",  			  MDBG_OFFSET(cons), MDBG_OFFSET(ao_lisp_ref(cons->car)), MDBG_OFFSET(ao_lisp_ref(cons->cdr)));  		(void) ao_lisp_poly_move(&cons->car, 1); -		cdr = ao_lisp_poly_cons(cons->cdr); +		cdr = cons->cdr;  		if (!cdr)  			break; -		ret = ao_lisp_move_memory(&ao_lisp_cons_type, (void **) &cdr); -		if (cdr != ao_lisp_poly_cons(cons->cdr)) -			cons->cdr = ao_lisp_cons_poly(cdr); +		if (ao_lisp_poly_type(cdr) != AO_LISP_CONS) { +			(void) ao_lisp_poly_move(&cons->cdr, 1); +			break; +		} +		c = ao_lisp_poly_cons(cdr); +		ret = ao_lisp_move_memory(&ao_lisp_cons_type, (void **) &c); +		if (c != ao_lisp_poly_cons(cons->cdr)) +			cons->cdr = ao_lisp_cons_poly(c);  		MDBG_MOVE("cons_move end %d (%d, %d)\n",  			  MDBG_OFFSET(cons), MDBG_OFFSET(ao_lisp_ref(cons->car)), MDBG_OFFSET(ao_lisp_ref(cons->cdr)));  		if (ret)  			break; -		cons = cdr; +		cons = c;  	}  } | 
