Basic: add step3, vector/hash-map evaluation.
[jackhill/mal.git] / basic / env.in.bas
1
2 REM ENV_NEW(EO%) -> R%
3 ENV_NEW:
4 REM allocate the data hashmap
5 GOSUB HASHMAP
6
7 REM set the data and outer pointer
8 ZE%(ZK%)=R%
9 ZO%(ZK%)=EO%
10
11 REM update environment pointer and return new environment
12 R%=ZK%
13 ZK%=ZK%+1
14 RETURN
15
16 REM ENV_SET(E%, K%, V%) -> R%
17 ENV_SET:
18 HM%=ZE%(E%)
19 GOSUB ASSOC1
20 ZE%(E%)=R%
21 R%=V%
22 RETURN
23
24 REM ENV_SET_S(E%, K$, V%) -> R%
25 ENV_SET_S:
26 HM%=ZE%(E%)
27 GOSUB ASSOC1_S
28 ZE%(E%)=R%
29 R%=V%
30 RETURN
31
32 REM ENV_FIND(E%, K%) -> R%
33 ENV_FIND:
34 EF%=E%
35 ENV_FIND_LOOP:
36 HM%=ZE%(EF%)
37 REM More efficient to use GET for value (R%) and contains? (T3%)
38 GOSUB HASHMAP_GET
39 REM if we found it, save value in T4% for ENV_GET
40 IF T3%=1 THEN T4%=R%: GOTO ENV_FIND_DONE
41 EF%=ZO%(EF%): REM get outer environment
42 IF EF%<>-1 THEN GOTO ENV_FIND_LOOP
43 ENV_FIND_DONE:
44 R%=EF%
45 RETURN
46
47 REM ENV_GET(E%, K%) -> R%
48 ENV_GET:
49 GOSUB ENV_FIND
50 IF R%=-1 THEN ER%=1: ER$="'" + ZS$(Z%(K%,1)) + "' not found": RETURN
51 R%=T4%
52 RETURN