diff options
Diffstat (limited to 'src/bootstrap/objects.c')
-rw-r--r-- | src/bootstrap/objects.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/src/bootstrap/objects.c b/src/bootstrap/objects.c index fd76166..b3aa3de 100644 --- a/src/bootstrap/objects.c +++ b/src/bootstrap/objects.c | |||
@@ -6,6 +6,7 @@ typedef enum ObjectType { | |||
6 | OBJ_TYPE_STRING, | 6 | OBJ_TYPE_STRING, |
7 | OBJ_TYPE_PAIR, | 7 | OBJ_TYPE_PAIR, |
8 | OBJ_TYPE_PROCEDURE, | 8 | OBJ_TYPE_PROCEDURE, |
9 | OBJ_TYPE_LAMBDA, | ||
9 | OBJ_TYPE_ERR, | 10 | OBJ_TYPE_ERR, |
10 | } ObjectType; | 11 | } ObjectType; |
11 | 12 | ||
@@ -37,6 +38,13 @@ typedef struct Object { | |||
37 | 38 | ||
38 | // OBJ_TYPE_PROCEDURE | 39 | // OBJ_TYPE_PROCEDURE |
39 | struct Object *(*proc)(struct Environment *env, struct Object *args); | 40 | struct Object *(*proc)(struct Environment *env, struct Object *args); |
41 | |||
42 | // OBJ_TYPE_LAMBDA | ||
43 | struct { | ||
44 | struct Object *args; | ||
45 | struct Object *body; | ||
46 | struct Environment *env; | ||
47 | }; | ||
40 | }; | 48 | }; |
41 | } Object; | 49 | } Object; |
42 | 50 | ||
@@ -118,6 +126,7 @@ obj_duplicate(Object *obj) { | |||
118 | case OBJ_TYPE_BOOL: | 126 | case OBJ_TYPE_BOOL: |
119 | case OBJ_TYPE_NIL: | 127 | case OBJ_TYPE_NIL: |
120 | case OBJ_TYPE_PROCEDURE: | 128 | case OBJ_TYPE_PROCEDURE: |
129 | case OBJ_TYPE_LAMBDA: // TODO: should we duplicate everything inside? | ||
121 | case OBJ_TYPE_ERR: { | 130 | case OBJ_TYPE_ERR: { |
122 | copy = obj; | 131 | copy = obj; |
123 | } break; | 132 | } break; |
@@ -176,6 +185,12 @@ free_objects(Object *root) { | |||
176 | } | 185 | } |
177 | free(root); | 186 | free(root); |
178 | } break; | 187 | } break; |
188 | case OBJ_TYPE_LAMBDA: { | ||
189 | free_objects(root->args); | ||
190 | free_objects(root->body); | ||
191 | // TODO: free_env(root->env); | ||
192 | free(root); | ||
193 | } break; | ||
179 | } | 194 | } |
180 | } | 195 | } |
181 | 196 | ||
@@ -222,6 +237,7 @@ display(Object *root) { | |||
222 | display_pair(root); | 237 | display_pair(root); |
223 | printf(")"); | 238 | printf(")"); |
224 | } break; | 239 | } break; |
240 | case OBJ_TYPE_LAMBDA: | ||
225 | case OBJ_TYPE_PROCEDURE: { | 241 | case OBJ_TYPE_PROCEDURE: { |
226 | printf("#{procedure}"); | 242 | printf("#{procedure}"); |
227 | } break; | 243 | } break; |