-
Notifications
You must be signed in to change notification settings - Fork 0
/
store.c
38 lines (35 loc) · 806 Bytes
/
store.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include "core.c"
#include "util.c"
Cell *symtree = NULL;
Cell *envlist = NULL;
Cell *nil, *tru, *quot;
/* add|lookup atomic symbols in a BST */
Cell *addsym(Cell **cpx, const char *sym, Keywrd key)
{
int c;
Cell *cp = *cpx;
if (!cp) {
if (key == NOKEY)
sym = dupstr(sym);
return *cpx = new_cell(new_atom(sym, key));
}
if ((c = strcmp(sym, cp->atm->sym)) < 0)
cp = addsym(&cp->car, sym, key);
else if (c > 0)
cp = addsym(&cp->cdr, sym, key);
return cp;
}
void initkeys(const char *syms[])
{
int k;
nil = addsym(&symtree, syms[NIL], NIL);
tru = addsym(&symtree, syms[T], T);
quot = addsym(&symtree, syms[QUOTE], QUOTE);
for (k = T + 1; k < NKEYS; ++k)
addsym(&symtree, syms[k], k);
}
Cell *bindenv(Cell *sym, Cell *val)
{
envlist = cons(list(sym, val), envlist);
return val;
}