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:
* struct cons_pointer lisp_let( struct cons_pointer args, struct cons_pointer env,
* 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.
*/
@ -62,7 +60,8 @@ struct cons_pointer eval_form( struct stack_frame *parent,
struct cons_pointer form,
struct cons_pointer env ) {
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 next_pointer = make_empty_frame( parent_pointer );
@ -81,6 +80,10 @@ struct cons_pointer eval_form( struct stack_frame *parent,
dec_ref( next_pointer );
}
debug_print( L"eval_form returning: ", DEBUG_EVAL );
debug_print_object( result, DEBUG_EVAL );
debug_println(DEBUG_EVAL);
return result;
}
@ -1413,25 +1416,41 @@ struct cons_pointer lisp_mapcar( struct stack_frame *frame,
struct cons_pointer frame_pointer,
struct cons_pointer env ) {
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 ) ) {
struct cons_pointer expr = make_cons(frame->arg[0], make_cons(c_car(c), NIL));
inc_ref(expr);
struct cons_pointer r = eval_form(frame, frame_pointer, expr, env);
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);
if ( exceptionp( r ) ) {
result = r;
inc_ref( expr ); // to protect exception from the later dec_ref
break;
} 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 );
}
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;
}
// /**