aboutsummaryrefslogtreecommitdiffstats
path: root/src/bootstrap/objects.h
blob: 56821eb131e2e8363cdd10873a4817f0014cccff (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#ifndef BDL_OBJECTS_H
#define BDL_OBJECTS_H

#include "string_view.h"

typedef enum ObjectType {
    OBJ_TYPE_FIXNUM,
    OBJ_TYPE_BOOL,
    OBJ_TYPE_NIL,
    OBJ_TYPE_SYMBOL,
    OBJ_TYPE_STRING,
    OBJ_TYPE_PAIR,
    OBJ_TYPE_PROCEDURE,
    OBJ_TYPE_LAMBDA,
    OBJ_TYPE_ERR,
} ObjectType;

struct Environment;

typedef struct Object {
    ObjectType type;
    bool marked;
    union {
        // OBJ_TYPE_FIXNUM
        ssize_t fixnum;

        // OBJ_TYPE_STRING
        struct {
            char *string;
            size_t string_n;
        };

        // OBJ_TYPE_PAIR
        struct {
            struct Object *car;
            struct Object *cdr;
        };

        // OBJ_TYPE_SYMBOL
        struct {
            char *symbol;
            size_t symbol_n;
        };

        // OBJ_TYPE_PROCEDURE
        struct Object *(*proc)(struct Environment *env, struct Object *args);

        // OBJ_TYPE_LAMBDA
        struct {
            struct Object *params;
            struct Object *body;
            struct Environment *env;
        };
    };
} Object;

// Object constructors.
Object * make_fixnum(ssize_t num);
Object * make_procedure(Object *(*proc)(struct Environment *, struct Object *args));
Object * make_pair(Object *car, Object *cdr);
Object * make_symbol(StringView sv);
Object * make_string(void);
void append_string(Object *obj, const StringView sv);

// Object representation.
void display(Object *root);
void display_pair(Object *root);

// Object comparison.
bool obj_eq(Object *a, Object* b);

// Utility macros.
#define DEBUG_OBJ(MSG,OBJ) printf((MSG)); display(OBJ); printf("\n");
#define PRINT_OBJ(OBJ) display(OBJ); printf("\n");
#define MAKE_SYM(STR) make_symbol((StringView){(STR), sizeof(STR) - 1})

#endif // BDL_OBJECTS_H