My monster, she builds!

This commit is contained in:
Simon Brooke 2026-05-04 10:34:07 +01:00
parent 92490ebd5f
commit 8c5dccb5c8
6 changed files with 283 additions and 13 deletions

View file

@ -17,6 +17,6 @@
#include "payloads/function.h"
struct pso_pointer length( struct pso_pointer frame_pointer );
struct pso_pointer count( struct pso_pointer frame_pointer );
#endif

View file

@ -9,15 +9,19 @@
* Licensed under GPL version 2.0, or, at your option, any later version.
*/
#include "debug.h"
#include "memory/node.h"
#include "memory/pointer.h"
#include "memory/pso.h"
#include "memory/pso4.h"
#include "memory/tags.h"
#include "ops/eval_apply.h"
#include "ops/reverse.h"
#include "ops/stack_ops.h"
#include "ops/truth.h"
#include "payloads/cons.h"
struct pso_pointer lisp_mapcar( struct pso_pointer frame_pointer ) {
@ -30,29 +34,28 @@ struct pso_pointer lisp_mapcar( struct pso_pointer frame_pointer ) {
for ( struct pso_pointer c = frame->payload.stack_frame.arg[1]; c_truep( c );
c = c_cdr( c ) ) {
struct pso_pointer expr =
cons( frame->payload.stack_frame.arg[0], make_cons( frame_pointer, c_car( c ), nil ) );
push_local( frame_pointer,
make_cons( frame_pointer, frame->payload.stack_frame.arg[0],
make_cons( frame_pointer, c_car( c ), nil ) ) );
debug_printf( DEBUG_EVAL, 0, U"Mapcar %d, evaluating ", i );
debug_print_object( expr, DEBUG_EVAL, 0 );
debug_println( DEBUG_EVAL);
struct pso_pointer r = eval_form( frame, frame_pointer, expr, env );
struct pso_pointer r = lisp_eval( push_local( frame_pointer, make_frame(1, frame_pointer, expr)));
if ( exceptionp( r ) ) {
result = r;
inc_ref( expr ); // to protect exception from the later dec_ref
break;
} else {
result = cons( r, result );
result = push_local( frame_pointer, make_cons( frame_pointer, r, result ));
}
debug_printf( DEBUG_EVAL, 0, U"Mapcar %d, result is ", i++ );
debug_print_object( result, DEBUG_EVAL, 0 );
debug_println( DEBUG_EVAL);
dec_ref( expr );
}
result = consp( result ) ? c_reverse( result ) : result;
result = consp( result ) ? c_reverse( frame_pointer, result ) : result;
debug_print( U"Mapcar returning: ", DEBUG_EVAL, 0 );
debug_print_object( result, DEBUG_EVAL, 0 );