/** * payloads/cons.h * * A cons cell. * * (c) 2026 Simon Brooke * Licensed under GPL version 2.0, or, at your option, any later version. */ #ifndef __psse_payloads_cons_h #define __psse_payloads_cons_h #include #include "memory/node.h" #include "memory/pointer.h" #include "memory/pso2.h" #include "memory/pso4.h" #define CONS_SIZE_CLASS 2 /* NOTE THAT the definition of a cons payload has to be in memory/pso2.h to * avoid circularity. */ struct pso_pointer car( struct pso_pointer frame_pointer ); struct pso_pointer cdr( struct pso_pointer frame_pointer ); struct pso_pointer cons( struct pso_pointer frame_pointer ); struct pso_pointer destroy_cons( struct pso_pointer frame_pointer ); struct pso_pointer make_cons( struct pso_pointer frame_pointer, struct pso_pointer car, struct pso_pointer cdr ); /** * macro short-cuts for make_cons. */ // #define make_cons(frame_pointer,car,cdr) (cons(make_frame(2, frame_pointer, car, cdr))) /** * Variant which assumes a convention that the frame pointer will always be * called `frame_pointer` */ #define make_cons2(car,cdr) (cons(make_frame(2, frame_pointer, car, cdr))) #define c_car(p)(sequencep(p) ? pointer_to_object(p)->payload.cons.car : nil) #define c_cdr(p)(sequencep(p) ? pointer_to_object(p)->payload.cons.cdr : nil) #endif