Skip to content

Commit c923200

Browse files
committed
basic: merge env_find into env_get
1 parent 7b54694 commit c923200

11 files changed

+31
-44
lines changed

impls/basic/env.in.bas

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -63,27 +63,16 @@ ENV_SET_S:
6363
R=C
6464
RETURN
6565

66-
REM ENV_FIND(E, K) -> R
67-
REM Returns environment (R) containing K. If found, value found is
68-
REM in R4
69-
SUB ENV_FIND
66+
REM ENV_GET(E, K) -> R
67+
REM R3 is either 0 (missing key) or 1, then R is the increfed value.
68+
SUB ENV_GET
7069
T=E
7170
ENV_FIND_LOOP:
7271
H=Z%(T+1)
7372
REM More efficient to use GET for value (R) and contains? (R3)
7473
GOSUB HASHMAP_GET
75-
REM if we found it, save value in R4 for ENV_GET
76-
IF R3=1 THEN R4=R:R=T:GOTO ENV_FIND_DONE
74+
REM if we found it, return it
75+
IF R3=1 THEN GOTO INC_REF_R
7776
T=Z%(T+2): REM get outer environment
7877
IF T>0 THEN GOTO ENV_FIND_LOOP
79-
R=-1
80-
ENV_FIND_DONE:
8178
END SUB
82-
83-
REM ENV_GET(E, K) -> R
84-
ENV_GET:
85-
CALL ENV_FIND
86-
IF R=-1 THEN ER=-1:E$="'"+S$(Z%(K+1))+"' not found":GOTO ENV_GET_RETURN
87-
R=R4
88-
GOSUB INC_REF_R
89-
GOTO ENV_GET_RETURN

impls/basic/step2_eval.in.bas

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,7 @@ SUB EVAL_AST
2929

3030
EVAL_AST_SYMBOL:
3131
H=E:K=A:GOSUB HASHMAP_GET
32-
IF R3=0 THEN R=-1:ER=-1:E$="'"+S$(Z%(A+1))+"' not found":GOTO EVAL_AST_RETURN
33-
GOSUB INC_REF_R
32+
IF R3=0 THEN ER=-1:E$="'"+S$(Z%(A+1))+"' not found" ELSE GOSUB INC_REF_R
3433
GOTO EVAL_AST_RETURN
3534

3635
EVAL_AST_SEQ:

impls/basic/step3_env.in.bas

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ SUB EVAL_AST
2929
GOTO EVAL_AST_RETURN
3030

3131
EVAL_AST_SYMBOL:
32-
K=A:GOTO ENV_GET
33-
ENV_GET_RETURN:
32+
K=A:GOSUB ENV_GET
33+
IF R3=0 THEN ER=-1:E$="'"+S$(Z%(A+1))+"' not found"
3434
GOTO EVAL_AST_RETURN
3535

3636
EVAL_AST_SEQ:

impls/basic/step4_if_fn_do.in.bas

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ SUB EVAL_AST
3030
GOTO EVAL_AST_RETURN
3131

3232
EVAL_AST_SYMBOL:
33-
K=A:GOTO ENV_GET
34-
ENV_GET_RETURN:
33+
K=A:GOSUB ENV_GET
34+
IF R3=0 THEN ER=-1:E$="'"+S$(Z%(A+1))+"' not found"
3535
GOTO EVAL_AST_RETURN
3636

3737
EVAL_AST_SEQ:

impls/basic/step5_tco.in.bas

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ SUB EVAL_AST
3030
GOTO EVAL_AST_RETURN
3131

3232
EVAL_AST_SYMBOL:
33-
K=A:GOTO ENV_GET
34-
ENV_GET_RETURN:
33+
K=A:GOSUB ENV_GET
34+
IF R3=0 THEN ER=-1:E$="'"+S$(Z%(A+1))+"' not found"
3535
GOTO EVAL_AST_RETURN
3636

3737
EVAL_AST_SEQ:

impls/basic/step6_file.in.bas

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ SUB EVAL_AST
3030
GOTO EVAL_AST_RETURN
3131

3232
EVAL_AST_SYMBOL:
33-
K=A:GOTO ENV_GET
34-
ENV_GET_RETURN:
33+
K=A:GOSUB ENV_GET
34+
IF R3=0 THEN ER=-1:E$="'"+S$(Z%(A+1))+"' not found"
3535
GOTO EVAL_AST_RETURN
3636

3737
EVAL_AST_SEQ:

impls/basic/step7_quote.in.bas

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,8 @@ SUB EVAL_AST
143143
GOTO EVAL_AST_RETURN
144144

145145
EVAL_AST_SYMBOL:
146-
K=A:GOTO ENV_GET
147-
ENV_GET_RETURN:
146+
K=A:GOSUB ENV_GET
147+
IF R3=0 THEN ER=-1:E$="'"+S$(Z%(A+1))+"' not found"
148148
GOTO EVAL_AST_RETURN
149149

150150
EVAL_AST_SEQ:

impls/basic/step8_macros.in.bas

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -138,9 +138,9 @@ SUB MACROEXPAND
138138
REM symbol? in first position
139139
IF (Z%(B)AND 31)<>5 THEN GOTO MACROEXPAND_DONE
140140
REM defined in environment?
141-
K=B:CALL ENV_FIND
142-
IF R=-1 THEN GOTO MACROEXPAND_DONE
143-
B=R4
141+
K=B:GOSUB ENV_GET
142+
IF R3=0 THEN GOTO MACROEXPAND_DONE
143+
B=R
144144
REM macro?
145145
IF (Z%(B)AND 31)<>11 THEN GOTO MACROEXPAND_DONE
146146

@@ -177,8 +177,8 @@ SUB EVAL_AST
177177
GOTO EVAL_AST_RETURN
178178

179179
EVAL_AST_SYMBOL:
180-
K=A:GOTO ENV_GET
181-
ENV_GET_RETURN:
180+
K=A:GOSUB ENV_GET
181+
IF R3=0 THEN ER=-1:E$="'"+S$(Z%(A+1))+"' not found"
182182
GOTO EVAL_AST_RETURN
183183

184184
EVAL_AST_SEQ:

impls/basic/step9_try.in.bas

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -138,9 +138,9 @@ SUB MACROEXPAND
138138
REM symbol? in first position
139139
IF (Z%(B)AND 31)<>5 THEN GOTO MACROEXPAND_DONE
140140
REM defined in environment?
141-
K=B:CALL ENV_FIND
142-
IF R=-1 THEN GOTO MACROEXPAND_DONE
143-
B=R4
141+
K=B:GOSUB ENV_GET
142+
IF R3=0 THEN GOTO MACROEXPAND_DONE
143+
B=R
144144
REM macro?
145145
IF (Z%(B)AND 31)<>11 THEN GOTO MACROEXPAND_DONE
146146

@@ -177,8 +177,8 @@ SUB EVAL_AST
177177
GOTO EVAL_AST_RETURN
178178

179179
EVAL_AST_SYMBOL:
180-
K=A:GOTO ENV_GET
181-
ENV_GET_RETURN:
180+
K=A:GOSUB ENV_GET
181+
IF R3=0 THEN ER=-1:E$="'"+S$(Z%(A+1))+"' not found"
182182
GOTO EVAL_AST_RETURN
183183

184184
EVAL_AST_SEQ:

impls/basic/stepA_mal.in.bas

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -138,9 +138,9 @@ SUB MACROEXPAND
138138
REM symbol? in first position
139139
IF (Z%(B)AND 31)<>5 THEN GOTO MACROEXPAND_DONE
140140
REM defined in environment?
141-
K=B:CALL ENV_FIND
142-
IF R=-1 THEN GOTO MACROEXPAND_DONE
143-
B=R4
141+
K=B:GOSUB ENV_GET
142+
IF R3=0 THEN GOTO MACROEXPAND_DONE
143+
B=R
144144
REM macro?
145145
IF (Z%(B)AND 31)<>11 THEN GOTO MACROEXPAND_DONE
146146

@@ -177,8 +177,8 @@ SUB EVAL_AST
177177
GOTO EVAL_AST_RETURN
178178

179179
EVAL_AST_SYMBOL:
180-
K=A:GOTO ENV_GET
181-
ENV_GET_RETURN:
180+
K=A:GOSUB ENV_GET
181+
IF R3=0 THEN ER=-1:E$="'"+S$(Z%(A+1))+"' not found"
182182
GOTO EVAL_AST_RETURN
183183

184184
EVAL_AST_SEQ:

impls/basic/variables.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@ P3 : PR_OBJECT, PR_MEMORY_VALUE
6060
R1 : REP, RE - MAL_READ result temp
6161
R2 : REP, RE - EVAL result temp
6262
R3 : HASHMAP_GET, DO_HASH_MAP, DO_KEYS_VALS temp and return value
63-
R4 : ENV_FIND temp and return value
6463
R6 : SLICE return value (last element)
6564
SZ : size argument to ALLOC
6665
S1$ : REPLACE needle

0 commit comments

Comments
 (0)