aboutsummaryrefslogtreecommitdiffstats
path: root/src/bootstrap/objects.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bootstrap/objects.c')
-rw-r--r--src/bootstrap/objects.c16
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;