Still doesn't compile, but I think excellent progress.
This commit is contained in:
parent
dbeb99759a
commit
aac4669a3d
34 changed files with 1128 additions and 673 deletions
62
src/c/ops/mapcar.c
Normal file
62
src/c/ops/mapcar.c
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
/**
|
||||
* ops/mapcar.c
|
||||
*
|
||||
* Post Scarcity Software Environment: mapcar.
|
||||
*
|
||||
* map a function across a sequence of forms.
|
||||
*
|
||||
* (c) 2026 Simon Brooke <simon@journeyman.cc>
|
||||
* 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/tags.h"
|
||||
#include "ops/reverse.h"
|
||||
#include "ops/truth.h"
|
||||
#include "payloads/cons.h"
|
||||
|
||||
struct pso_pointer lisp_mapcar( struct pso4 *frame,
|
||||
struct pso_pointer frame_pointer,
|
||||
struct pso_pointer env ) {
|
||||
struct pso_pointer result = nil;
|
||||
debug_print( U"Mapcar: ", DEBUG_EVAL, 0 );
|
||||
debug_dump_object( frame_pointer, DEBUG_EVAL, 0 );
|
||||
int i = 0;
|
||||
|
||||
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], cons( 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, 0 );
|
||||
|
||||
struct pso_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 = cons( 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;
|
||||
|
||||
debug_print( U"Mapcar returning: ", DEBUG_EVAL, 0 );
|
||||
debug_print_object( result, DEBUG_EVAL, 0 );
|
||||
debug_println( DEBUG_EVAL );
|
||||
|
||||
return result;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue