aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-31 11:15:16 +0100
committerBad Diode <bd@badd10de.dev>2021-10-31 11:15:16 +0100
commit3ed3aa338296f82046de2061e717b49328c8b057 (patch)
treeab7a90c367e54edc15f272618b4fafb0447446c0
parenta31eff3926b4355ab9a4d7a76b0007fae0dd68b2 (diff)
downloadbdl-3ed3aa338296f82046de2061e717b49328c8b057.tar.gz
bdl-3ed3aa338296f82046de2061e717b49328c8b057.zip
Ensure lambdas wrap their env tables
-rw-r--r--src/parser.c6
-rwxr-xr-xsrc/parser.h11
2 files changed, 10 insertions, 7 deletions
diff --git a/src/parser.c b/src/parser.c
index d1a5e7a..59e8075 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -91,6 +91,7 @@ parse_lambda(Parser *parser, Errors *errors) {
91 Object *lambda = object_alloc(start, OBJ_TYPE_LAMBDA); 91 Object *lambda = object_alloc(start, OBJ_TYPE_LAMBDA);
92 array_init(lambda->params, 0); 92 array_init(lambda->params, 0);
93 array_init(lambda->body, 0); 93 array_init(lambda->body, 0);
94 lambda->env = NULL;
94 95
95 // Parse parameters. 96 // Parse parameters.
96 Token tok = next_token(parser); 97 Token tok = next_token(parser);
@@ -450,6 +451,7 @@ check_object_scope(Environment *env, Object *obj, Errors *errors) {
450 } break; 451 } break;
451 case OBJ_TYPE_LAMBDA: { 452 case OBJ_TYPE_LAMBDA: {
452 Environment *new_env = env_alloc(env); 453 Environment *new_env = env_alloc(env);
454 obj->env = new_env;
453 for (size_t i = 0; i < array_size(obj->body); i++) { 455 for (size_t i = 0; i < array_size(obj->body); i++) {
454 Object *expr = obj->body[i]; 456 Object *expr = obj->body[i];
455 check_object_scope(new_env, expr, errors); 457 check_object_scope(new_env, expr, errors);
@@ -488,7 +490,7 @@ remove_unused_expr(Object *obj) {
488 IS_STRING(expr) || 490 IS_STRING(expr) ||
489 IS_SYMBOL(expr) || 491 IS_SYMBOL(expr) ||
490 IS_LAMBDA(expr) || 492 IS_LAMBDA(expr) ||
491 IS_BOOL(expr) || 493 IS_BOOL(expr) ||
492 IS_NIL(expr)) { 494 IS_NIL(expr)) {
493 continue; 495 continue;
494 } 496 }
@@ -556,7 +558,7 @@ parse(Token *tokens, Errors *errors) {
556 IS_STRING(root) || 558 IS_STRING(root) ||
557 IS_SYMBOL(root) || 559 IS_SYMBOL(root) ||
558 IS_LAMBDA(root) || 560 IS_LAMBDA(root) ||
559 IS_BOOL(root) || 561 IS_BOOL(root) ||
560 IS_NIL(root)) { 562 IS_NIL(root)) {
561 continue; 563 continue;
562 } 564 }
diff --git a/src/parser.h b/src/parser.h
index 01f53b0..fa8858e 100755
--- a/src/parser.h
+++ b/src/parser.h
@@ -4,6 +4,11 @@
4#include "lexer.h" 4#include "lexer.h"
5#include "hashtable.h" 5#include "hashtable.h"
6 6
7typedef struct Environment {
8 HashTable *table;
9 struct Environment *parent;
10} Environment;
11
7typedef enum ObjectType { 12typedef enum ObjectType {
8 OBJ_TYPE_NIL, 13 OBJ_TYPE_NIL,
9 OBJ_TYPE_TRUE, 14 OBJ_TYPE_TRUE,
@@ -38,6 +43,7 @@ typedef struct Object {
38 struct { 43 struct {
39 struct Object **params; 44 struct Object **params;
40 struct Object **body; 45 struct Object **body;
46 Environment *env;
41 }; 47 };
42 48
43 // OBJ_TYPE_IF 49 // OBJ_TYPE_IF
@@ -59,11 +65,6 @@ typedef struct Object {
59 size_t col; 65 size_t col;
60} Object; 66} Object;
61 67
62typedef struct Environment {
63 HashTable *table;
64 struct Environment *parent;
65} Environment;
66
67typedef struct Parser { 68typedef struct Parser {
68 Token *tokens; 69 Token *tokens;
69 size_t current; 70 size_t current;