Mapcar working; really only let
left to do for version 0.1
This commit is contained in:
parent
4047b88cae
commit
06e87f09fa
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
// /**
|
// /**
|
||||||
|
|
Loading…
Reference in a new issue