]> git.lizzy.rs Git - nothing.git/blob - src/script/scope.c
Merge pull request #319 from tsoding/gc
[nothing.git] / src / script / scope.c
1 #include "./scope.h"
2
3 struct Expr get_scope_value(struct Expr scope, struct Expr name)
4 {
5     if (cons_p(scope)) {
6         struct Expr value = assoc(name, scope.cons->car);
7         return nil_p(value) ? get_scope_value(scope.cons->cdr, name) : value;
8     }
9
10     return scope;
11 }
12
13 struct Expr set_scope_value(Gc *gc, struct Expr scope, struct Expr name, struct Expr value)
14 {
15     if (cons_p(scope)) {
16         if (!nil_p(assoc(name, scope.cons->car))) {
17             return CONS(gc, CONS(gc, name, value), scope);
18         } else {
19             scope.cons->cdr = set_scope_value(gc, scope.cons->cdr, name, value);
20             return scope;
21         }
22     } else {
23         /* TODO(#318): set_scope_value creates redundant global scopes */
24         return CONS(gc, CONS(gc, name, value), NIL(gc));
25     }
26 }