Commit | Line | Data |
---|---|---|
0cb556e0 JM |
1 | |
2 | REM ENV_NEW(EO%) -> R% | |
3 | ENV_NEW: | |
4 | REM allocate the data hashmap | |
5 | GOSUB HASHMAP | |
6 | ||
60270667 JM |
7 | REM set the outer and data pointer |
8 | Z%(ZI%,0) = 14 | |
9 | Z%(ZI%,1) = R% | |
10 | Z%(ZI%+1,0) = 14 | |
11 | Z%(ZI%+1,1) = EO% | |
0cb556e0 | 12 | |
60270667 JM |
13 | REM allocate space and return new environment |
14 | R%=ZI% | |
15 | ZI%=ZI%+2 | |
0cb556e0 JM |
16 | RETURN |
17 | ||
241d5d57 JM |
18 | REM ENV_NEW_BINDS(EO%, BI%, EX%) -> R% |
19 | ENV_NEW_BINDS: | |
20 | GOSUB ENV_NEW | |
21 | E%=R% | |
22 | REM process bindings | |
23 | ENV_NEW_BINDS_LOOP: | |
24 | IF Z%(BI%,1)=0 THEN R%=E%: RETURN | |
25 | REM get/deref the key from BI% | |
26 | R%=BI%+1: GOSUB DEREF | |
27 | K%=R% | |
28 | ||
29 | IF ZS$(Z%(K%,1))="&" THEN EVAL_NEW_BINDS_VARGS: | |
30 | ||
31 | EVAL_NEW_BINDS_1x1: | |
32 | REM get/deref the key from EX% | |
33 | R%=EX%+1: GOSUB DEREF | |
34 | V%=R% | |
35 | REM set the binding in the environment data | |
36 | GOSUB ENV_SET | |
37 | REM go to next element of BI% and EX% | |
38 | BI%=Z%(BI%,1) | |
39 | EX%=Z%(EX%,1) | |
40 | GOTO ENV_NEW_BINDS_LOOP | |
41 | ||
42 | EVAL_NEW_BINDS_VARGS: | |
43 | REM get/deref the key from next element of BI% | |
44 | BI%=Z%(BI%,1) | |
45 | R%=BI%+1: GOSUB DEREF | |
46 | K%=R% | |
47 | REM the value is the remaining list in EX% | |
48 | V%=EX% | |
49 | REM set the binding in the environment data | |
50 | GOSUB ENV_SET | |
51 | R%=E% | |
52 | RETURN | |
53 | ||
0cb556e0 JM |
54 | REM ENV_SET(E%, K%, V%) -> R% |
55 | ENV_SET: | |
60270667 | 56 | HM%=Z%(E%,1) |
0cb556e0 | 57 | GOSUB ASSOC1 |
60270667 | 58 | Z%(E%,1)=R% |
0cb556e0 JM |
59 | R%=V% |
60 | RETURN | |
61 | ||
62 | REM ENV_SET_S(E%, K$, V%) -> R% | |
63 | ENV_SET_S: | |
60270667 | 64 | HM%=Z%(E%,1) |
0cb556e0 | 65 | GOSUB ASSOC1_S |
60270667 | 66 | Z%(E%,1)=R% |
0cb556e0 JM |
67 | R%=V% |
68 | RETURN | |
69 | ||
70 | REM ENV_FIND(E%, K%) -> R% | |
71 | ENV_FIND: | |
72 | EF%=E% | |
73 | ENV_FIND_LOOP: | |
60270667 | 74 | HM%=Z%(EF%,1) |
0cb556e0 JM |
75 | REM More efficient to use GET for value (R%) and contains? (T3%) |
76 | GOSUB HASHMAP_GET | |
77 | REM if we found it, save value in T4% for ENV_GET | |
78 | IF T3%=1 THEN T4%=R%: GOTO ENV_FIND_DONE | |
60270667 | 79 | EF%=Z%(EF%+1,1): REM get outer environment |
0cb556e0 JM |
80 | IF EF%<>-1 THEN GOTO ENV_FIND_LOOP |
81 | ENV_FIND_DONE: | |
82 | R%=EF% | |
83 | RETURN | |
84 | ||
85 | REM ENV_GET(E%, K%) -> R% | |
86 | ENV_GET: | |
87 | GOSUB ENV_FIND | |
88 | IF R%=-1 THEN ER%=1: ER$="'" + ZS$(Z%(K%,1)) + "' not found": RETURN | |
89 | R%=T4% | |
90 | RETURN |