49 lines
1.3 KiB
C
49 lines
1.3 KiB
C
/**
|
|
* payloads/cons.h
|
|
*
|
|
* A cons cell.
|
|
*
|
|
* (c) 2026 Simon Brooke <simon@journeyman.cc>
|
|
* Licensed under GPL version 2.0, or, at your option, any later version.
|
|
*/
|
|
|
|
#ifndef __psse_payloads_cons_h
|
|
#define __psse_payloads_cons_h
|
|
#include <stdbool.h>
|
|
|
|
#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
|