Basic: move environment into normal memory.
[jackhill/mal.git] / basic / env.in.bas
CommitLineData
0cb556e0
JM
1
2REM ENV_NEW(EO%) -> R%
3ENV_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
18REM ENV_NEW_BINDS(EO%, BI%, EX%) -> R%
19ENV_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
54REM ENV_SET(E%, K%, V%) -> R%
55ENV_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
62REM ENV_SET_S(E%, K$, V%) -> R%
63ENV_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
70REM ENV_FIND(E%, K%) -> R%
71ENV_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
85REM ENV_GET(E%, K%) -> R%
86ENV_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