Mapcar working; really only let left to do for version 0.1

This commit is contained in:
Simon Brooke 2021-09-08 13:12:40 +01:00
parent 4047b88cae
commit 06e87f09fa
No known key found for this signature in database
GPG key ID: A7A4F18D1D4DF987

View file

@ -42,8 +42,6 @@
* also to create in this section: * also to create in this section:
* struct cons_pointer lisp_let( struct cons_pointer args, struct cons_pointer env, * struct cons_pointer lisp_let( struct cons_pointer args, struct cons_pointer env,
* struct stack_frame* frame); * struct stack_frame* frame);
* struct cons_pointer lisp_mapcar( struct cons_pointer args, struct cons_pointer env,
* struct stack_frame* frame);
* *
* and others I haven't thought of yet. * and others I haven't thought of yet.
*/ */
@ -62,7 +60,8 @@ struct cons_pointer eval_form( struct stack_frame *parent,
struct cons_pointer form, struct cons_pointer form,
struct cons_pointer env ) { struct cons_pointer env ) {
debug_print( L"eval_form: ", DEBUG_EVAL ); debug_print( L"eval_form: ", DEBUG_EVAL );
debug_dump_object( form, DEBUG_EVAL ); debug_print_object( form, DEBUG_EVAL );
debug_println(DEBUG_EVAL);
struct cons_pointer result = NIL; struct cons_pointer result = NIL;
struct cons_pointer next_pointer = make_empty_frame( parent_pointer ); struct cons_pointer next_pointer = make_empty_frame( parent_pointer );
@ -81,6 +80,10 @@ struct cons_pointer eval_form( struct stack_frame *parent,
dec_ref( next_pointer ); dec_ref( next_pointer );
} }
debug_print( L"eval_form returning: ", DEBUG_EVAL );
debug_print_object( result, DEBUG_EVAL );
debug_println(DEBUG_EVAL);
return result; return result;
} }
@ -1413,11 +1416,18 @@ struct cons_pointer lisp_mapcar( struct stack_frame *frame,
struct cons_pointer frame_pointer, struct cons_pointer frame_pointer,
struct cons_pointer env ) { struct cons_pointer env ) {
struct cons_pointer result = NIL; struct cons_pointer result = NIL;
debug_print( L"Mapcar: ", DEBUG_EVAL );
debug_dump_object( frame_pointer, DEBUG_EVAL );
int i = 0;
for ( struct cons_pointer c = frame->arg[1]; truep( c ); c = c_cdr( c ) ) { for ( struct cons_pointer c = frame->arg[1]; truep( c ); c = c_cdr( c ) ) {
struct cons_pointer expr = make_cons(frame->arg[0], make_cons(c_car(c), NIL)); struct cons_pointer expr = make_cons(frame->arg[0], make_cons(c_car(c), NIL));
inc_ref(expr); inc_ref(expr);
debug_printf(DEBUG_EVAL, L"Mapcar %d, evaluating ", i);
debug_print_object( expr, DEBUG_EVAL);
debug_println(DEBUG_EVAL);
struct cons_pointer r = eval_form(frame, frame_pointer, expr, env); struct cons_pointer r = eval_form(frame, frame_pointer, expr, env);
if ( exceptionp( r ) ) { if ( exceptionp( r ) ) {
@ -1425,13 +1435,22 @@ struct cons_pointer lisp_mapcar( struct stack_frame *frame,
inc_ref( expr ); // to protect exception from the later dec_ref inc_ref( expr ); // to protect exception from the later dec_ref
break; break;
} else { } else {
result = make_cons( c, result ); result = make_cons( r, result );
} }
debug_printf(DEBUG_EVAL, L"Mapcar %d, result is ", i++);
debug_print_object( result, DEBUG_EVAL);
debug_println(DEBUG_EVAL);
dec_ref( expr ); dec_ref( expr );
} }
return c_reverse( result ); result = consp(result) ? c_reverse( result ) : result;
debug_print( L"Mapcar returning: ", DEBUG_EVAL );
debug_print_object( result, DEBUG_EVAL );
debug_println(DEBUG_EVAL);
return result;
} }
// /** // /**