From ab23395b1fc88bbc63bef88de3477cc316857ace Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Thu, 14 Oct 2021 10:29:55 +0200 Subject: Add initial lambda implementation --- src/bootstrap/objects.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'src/bootstrap/objects.c') 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 { OBJ_TYPE_STRING, OBJ_TYPE_PAIR, OBJ_TYPE_PROCEDURE, + OBJ_TYPE_LAMBDA, OBJ_TYPE_ERR, } ObjectType; @@ -37,6 +38,13 @@ typedef struct Object { // OBJ_TYPE_PROCEDURE struct Object *(*proc)(struct Environment *env, struct Object *args); + + // OBJ_TYPE_LAMBDA + struct { + struct Object *args; + struct Object *body; + struct Environment *env; + }; }; } Object; @@ -118,6 +126,7 @@ obj_duplicate(Object *obj) { case OBJ_TYPE_BOOL: case OBJ_TYPE_NIL: case OBJ_TYPE_PROCEDURE: + case OBJ_TYPE_LAMBDA: // TODO: should we duplicate everything inside? case OBJ_TYPE_ERR: { copy = obj; } break; @@ -176,6 +185,12 @@ free_objects(Object *root) { } free(root); } break; + case OBJ_TYPE_LAMBDA: { + free_objects(root->args); + free_objects(root->body); + // TODO: free_env(root->env); + free(root); + } break; } } @@ -222,6 +237,7 @@ display(Object *root) { display_pair(root); printf(")"); } break; + case OBJ_TYPE_LAMBDA: case OBJ_TYPE_PROCEDURE: { printf("#{procedure}"); } break; -- cgit v1.2.1