diff --git a/src/repl.c b/src/repl.c index f3a51bd..a11e511 100644 --- a/src/repl.c +++ b/src/repl.c @@ -46,7 +46,7 @@ struct cons_pointer repl_read( struct cons_pointer stream_pointer ) { struct cons_pointer repl_eval( struct cons_pointer input ) { struct stack_frame *frame = make_empty_frame( NULL, oblist ); - frame->arg[0] = NIL /* input */ ; + frame->arg[0] = input; struct cons_pointer result = lisp_eval( frame, oblist ); free_stack_frame( frame ); @@ -89,7 +89,7 @@ repl( FILE * in_stream, FILE * out_stream, FILE * error_stream, struct cons_pointer val = repl_eval( repl_read( input_stream ) ); /* suppress the 'end of stream' exception */ - if ( exceptionp( val ) && + if ( !exceptionp( val ) && !feof( pointer2cell( input_stream ).payload.stream.stream ) ) { repl_print( output_stream, val ); } diff --git a/src/stack.c b/src/stack.c index 7b4d2da..2c3aa68 100644 --- a/src/stack.c +++ b/src/stack.c @@ -69,7 +69,7 @@ struct stack_frame *make_stack_frame( struct stack_frame *previous, struct cons_pointer env ) { struct stack_frame *result = make_empty_frame( previous, env ); - for ( int i = 0; i < args_in_frame && !nilp( args ); i++ ) { + for ( int i = 0; i < args_in_frame && consp( args ); i++ ) { /* iterate down the arg list filling in the arg slots in the * frame. When there are no more slots, if there are still args, * stash them on more */ @@ -81,17 +81,19 @@ struct stack_frame *make_stack_frame( struct stack_frame *previous, * processor to be evaled in parallel; but see notes here: * https://github.com/simon-brooke/post-scarcity/wiki/parallelism */ - struct stack_frame *arg_frame = make_empty_frame( previous, env ); + struct stack_frame *arg_frame = make_empty_frame( result, env ); arg_frame->arg[0] = cell.payload.cons.car; inc_ref( arg_frame->arg[0] ); + struct cons_pointer val = lisp_eval( arg_frame, env ); - if ( pointer2cell( val ).tag.value == EXCEPTIONTV ) { + if ( exceptionp( val ) ) { result->arg[0] = val; break; } else { result->arg[i] = val; } inc_ref( val ); + free_stack_frame( arg_frame ); args = cell.payload.cons.cdr; @@ -147,7 +149,9 @@ void free_stack_frame( struct stack_frame *frame ) { for ( int i = 0; i < args_in_frame; i++ ) { dec_ref( frame->arg[i] ); } - dec_ref( frame->more ); + if ( !nilp( frame->more ) ) { + dec_ref( frame->more ); + } free( frame ); }