Skip to content

Commit 72da7f8

Browse files
committed
Capturing the current execution context
1 parent 6add388 commit 72da7f8

File tree

3 files changed

+18
-0
lines changed

3 files changed

+18
-0
lines changed

interpreter.c

+13
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ static Object *apply_built_in(Object *, Object *, ErrorHandler, Binding *);
1919
static Object *apply_lambda(Object *, Object *, ErrorHandler, Binding *);
2020
static Object *execute(Callable, Object *, ErrorHandler, Binding *);
2121
static void bind_parameters(Object *, Object *, ErrorHandler, Binding *);
22+
static void binding_writer(void *, Printf);
2223

2324
void create_interpreter(void) {
2425
declare_nil();
@@ -41,6 +42,14 @@ Binding *top_level(void) {
4142
return top_level_binding;
4243
}
4344

45+
void declare_binding(void) {
46+
binding_type = declare("Binding", (Free)free_binding, binding_writer);
47+
}
48+
49+
Object *capture_binding(Binding *binding) {
50+
return wrap(binding_type, binding);
51+
}
52+
4453
Object *eval(Object *object, ErrorHandler error, Binding *binding) {
4554
Object *result;
4655
create_local();
@@ -148,3 +157,7 @@ static void bind_parameters(Object *parameters, Object *arguments, ErrorHandler
148157
add(binding, (char *)value(car(parameters)), clone(car(arguments)));
149158
bind_parameters(cdr(parameters), cdr(arguments), error, binding);
150159
}
160+
161+
static void binding_writer(void *binding, Printf printer) {
162+
printer("<Binding>");
163+
}

interpreter.h

+4
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,13 @@
55
#include "exception.h"
66
#include "binding.h"
77

8+
Type *binding_type;
9+
810
void create_interpreter(void);
911
void free_interpreter(void);
1012
Binding *top_level(void);
13+
void declare_binding(void);
14+
Object *capture_binding(Binding *);
1115
Object *eval(Object *, ErrorHandler, Binding *);
1216
Object *apply(Object *, Object *, ErrorHandler, Binding *);
1317

type.h

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
typedef struct Object_ Object;
77
typedef struct Type_ Type;
88
typedef int (*Printf)(char *, ...);
9+
typedef void (*Free)(void *);
910

1011
Type *declare(char *name, void (*destructor)(void *), void (*writer)(void *, Printf));
1112
Object *wrap(Type *, void *);

0 commit comments

Comments
 (0)