Skip to content

Commit 25bd3df

Browse files
committed
basic: merge eval_ast and macroexpand into EVAL
1 parent 2d403dc commit 25bd3df

File tree

3 files changed

+30
-129
lines changed

3 files changed

+30
-129
lines changed

impls/basic/step8_macros.in.bas

Lines changed: 10 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -122,42 +122,6 @@ SUB QQ_FOLDR
122122
QQ_FOLDR_DONE:
123123
END SUB
124124

125-
REM MACROEXPAND(A, E) -> A:
126-
SUB MACROEXPAND
127-
GOSUB PUSH_A
128-
129-
MACROEXPAND_LOOP:
130-
REM list?
131-
GOSUB TYPE_A
132-
IF T<>6 THEN GOTO MACROEXPAND_DONE
133-
REM non-empty?
134-
IF Z%(A+1)=0 THEN GOTO MACROEXPAND_DONE
135-
B=Z%(A+2)
136-
REM symbol? in first position
137-
IF (Z%(B)AND 31)<>5 THEN GOTO MACROEXPAND_DONE
138-
REM defined in environment?
139-
B$=S$(Z%(B+1)):CALL ENV_GET
140-
IF R3=0 THEN GOTO MACROEXPAND_DONE
141-
B=R
142-
REM macro?
143-
IF (Z%(B)AND 31)<>11 THEN GOTO MACROEXPAND_DONE
144-
145-
GOSUB INC_REF_R
146-
F=B:AR=Z%(A+1):CALL APPLY
147-
A=R
148-
149-
GOSUB PEEK_Q:AY=Q
150-
REM if previous A was not the first A into macroexpand (i.e. an
151-
REM intermediate form) then free it
152-
IF A<>AY THEN GOSUB PEND_A_LV
153-
154-
IF ER<>-2 THEN GOTO MACROEXPAND_DONE
155-
GOTO MACROEXPAND_LOOP
156-
157-
MACROEXPAND_DONE:
158-
GOSUB POP_Q: REM pop original A
159-
END SUB
160-
161125
REM EVAL_AST(A, E) -> R
162126
SUB EVAL_AST
163127
REM push A and E on the stack
@@ -233,8 +197,6 @@ SUB EVAL
233197

234198
IF ER<>-2 THEN GOTO EVAL_RETURN
235199

236-
EVAL_NOT_LIST:
237-
238200
B$="DEBUG-EVAL":CALL ENV_GET
239201
IF R3=0 OR R=0 OR R=2 THEN GOTO DEBUG_EVAL_DONE
240202
AZ=A:B=1:GOSUB PR_STR
@@ -262,10 +224,6 @@ SUB EVAL
262224
GOTO EVAL_RETURN
263225

264226
APPLY_LIST:
265-
CALL MACROEXPAND
266-
267-
GOSUB LIST_Q
268-
IF R<>1 THEN GOTO EVAL_NOT_LIST
269227

270228
GOSUB EMPTY_Q
271229
IF R THEN R=A:GOSUB INC_REF_R:GOTO EVAL_RETURN
@@ -435,12 +393,21 @@ SUB EVAL
435393

436394
GOSUB TYPE_F
437395
T=T-8
438-
IF 0<T THEN ON T GOTO EVAL_DO_FUNCTION,EVAL_DO_MAL_FUNCTION
396+
IF 0<T THEN ON T GOTO EVAL_DO_FUNCTION,EVAL_DO_MAL_FUNCTION,EVAL_MACRO
439397

440398
REM if error, pop and return f for release by caller
441399
GOSUB POP_R
442400
ER=-1:E$="apply of non-function":GOTO EVAL_RETURN
443401

402+
EVAL_MACRO:
403+
REM Apply F to the unevaluated rest of A, then free the memory for F.
404+
AR=Z%(A+1):CALL APPLY
405+
GOSUB POP_Q:AY=Q:GOSUB RELEASE
406+
IF ER<>-2 THEN GOTO EVAL_RETURN
407+
408+
REM Evaluate the result of this macro expansion.
409+
A=R:GOTO EVAL_TCO_RECUR: REM TCO loop
410+
444411
EVAL_DO_FUNCTION:
445412
REM regular function
446413

impls/basic/step9_try.in.bas

Lines changed: 10 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -122,42 +122,6 @@ SUB QQ_FOLDR
122122
QQ_FOLDR_DONE:
123123
END SUB
124124

125-
REM MACROEXPAND(A, E) -> A:
126-
SUB MACROEXPAND
127-
GOSUB PUSH_A
128-
129-
MACROEXPAND_LOOP:
130-
REM list?
131-
GOSUB TYPE_A
132-
IF T<>6 THEN GOTO MACROEXPAND_DONE
133-
REM non-empty?
134-
IF Z%(A+1)=0 THEN GOTO MACROEXPAND_DONE
135-
B=Z%(A+2)
136-
REM symbol? in first position
137-
IF (Z%(B)AND 31)<>5 THEN GOTO MACROEXPAND_DONE
138-
REM defined in environment?
139-
B$=S$(Z%(B+1)):CALL ENV_GET
140-
IF R3=0 THEN GOTO MACROEXPAND_DONE
141-
B=R
142-
REM macro?
143-
IF (Z%(B)AND 31)<>11 THEN GOTO MACROEXPAND_DONE
144-
145-
GOSUB INC_REF_R
146-
F=B:AR=Z%(A+1):CALL APPLY
147-
A=R
148-
149-
GOSUB PEEK_Q:AY=Q
150-
REM if previous A was not the first A into macroexpand (i.e. an
151-
REM intermediate form) then free it
152-
IF A<>AY THEN GOSUB PEND_A_LV
153-
154-
IF ER<>-2 THEN GOTO MACROEXPAND_DONE
155-
GOTO MACROEXPAND_LOOP
156-
157-
MACROEXPAND_DONE:
158-
GOSUB POP_Q: REM pop original A
159-
END SUB
160-
161125
REM EVAL_AST(A, E) -> R
162126
SUB EVAL_AST
163127
REM push A and E on the stack
@@ -233,8 +197,6 @@ SUB EVAL
233197

234198
IF ER<>-2 THEN GOTO EVAL_RETURN
235199

236-
EVAL_NOT_LIST:
237-
238200
B$="DEBUG-EVAL":CALL ENV_GET
239201
IF R3=0 OR R=0 OR R=2 THEN GOTO DEBUG_EVAL_DONE
240202
AZ=A:B=1:GOSUB PR_STR
@@ -262,10 +224,6 @@ SUB EVAL
262224
GOTO EVAL_RETURN
263225

264226
APPLY_LIST:
265-
CALL MACROEXPAND
266-
267-
GOSUB LIST_Q
268-
IF R<>1 THEN GOTO EVAL_NOT_LIST
269227

270228
GOSUB EMPTY_Q
271229
IF R THEN R=A:GOSUB INC_REF_R:GOTO EVAL_RETURN
@@ -468,12 +426,21 @@ SUB EVAL
468426

469427
GOSUB TYPE_F
470428
T=T-8
471-
IF 0<T THEN ON T GOTO EVAL_DO_FUNCTION,EVAL_DO_MAL_FUNCTION
429+
IF 0<T THEN ON T GOTO EVAL_DO_FUNCTION,EVAL_DO_MAL_FUNCTION,EVAL_MACRO
472430

473431
REM if error, pop and return f for release by caller
474432
GOSUB POP_R
475433
ER=-1:E$="apply of non-function":GOTO EVAL_RETURN
476434

435+
EVAL_MACRO:
436+
REM Apply F to the unevaluated rest of A, then free the memory for F.
437+
AR=Z%(A+1):CALL APPLY
438+
GOSUB POP_Q:AY=Q:GOSUB RELEASE
439+
IF ER<>-2 THEN GOTO EVAL_RETURN
440+
441+
REM Evaluate the result of this macro expansion.
442+
A=R:GOTO EVAL_TCO_RECUR: REM TCO loop
443+
477444
EVAL_DO_FUNCTION:
478445
REM regular function
479446

impls/basic/stepA_mal.in.bas

Lines changed: 10 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -122,42 +122,6 @@ SUB QQ_FOLDR
122122
QQ_FOLDR_DONE:
123123
END SUB
124124

125-
REM MACROEXPAND(A, E) -> A:
126-
SUB MACROEXPAND
127-
GOSUB PUSH_A
128-
129-
MACROEXPAND_LOOP:
130-
REM list?
131-
GOSUB TYPE_A
132-
IF T<>6 THEN GOTO MACROEXPAND_DONE
133-
REM non-empty?
134-
IF Z%(A+1)=0 THEN GOTO MACROEXPAND_DONE
135-
B=Z%(A+2)
136-
REM symbol? in first position
137-
IF (Z%(B)AND 31)<>5 THEN GOTO MACROEXPAND_DONE
138-
REM defined in environment?
139-
B$=S$(Z%(B+1)):CALL ENV_GET
140-
IF R3=0 THEN GOTO MACROEXPAND_DONE
141-
B=R
142-
REM macro?
143-
IF (Z%(B)AND 31)<>11 THEN GOTO MACROEXPAND_DONE
144-
145-
GOSUB INC_REF_R
146-
F=B:AR=Z%(A+1):CALL APPLY
147-
A=R
148-
149-
GOSUB PEEK_Q:AY=Q
150-
REM if previous A was not the first A into macroexpand (i.e. an
151-
REM intermediate form) then free it
152-
IF A<>AY THEN GOSUB PEND_A_LV
153-
154-
IF ER<>-2 THEN GOTO MACROEXPAND_DONE
155-
GOTO MACROEXPAND_LOOP
156-
157-
MACROEXPAND_DONE:
158-
GOSUB POP_Q: REM pop original A
159-
END SUB
160-
161125
REM EVAL_AST(A, E) -> R
162126
SUB EVAL_AST
163127
REM push A and E on the stack
@@ -233,8 +197,6 @@ SUB EVAL
233197

234198
IF ER<>-2 THEN GOTO EVAL_RETURN
235199

236-
EVAL_NOT_LIST:
237-
238200
B$="DEBUG-EVAL":CALL ENV_GET
239201
IF R3=0 OR R=0 OR R=2 THEN GOTO DEBUG_EVAL_DONE
240202
AZ=A:B=1:GOSUB PR_STR
@@ -262,10 +224,6 @@ SUB EVAL
262224
GOTO EVAL_RETURN
263225

264226
APPLY_LIST:
265-
CALL MACROEXPAND
266-
267-
GOSUB LIST_Q
268-
IF R<>1 THEN GOTO EVAL_NOT_LIST
269227

270228
GOSUB EMPTY_Q
271229
IF R THEN R=A:GOSUB INC_REF_R:GOTO EVAL_RETURN
@@ -470,12 +428,21 @@ SUB EVAL
470428
GOSUB TYPE_F
471429
IF T=14 THEN F=Z%(F+1):GOSUB TYPE_F
472430
T=T-8
473-
IF 0<T THEN ON T GOTO EVAL_DO_FUNCTION,EVAL_DO_MAL_FUNCTION
431+
IF 0<T THEN ON T GOTO EVAL_DO_FUNCTION,EVAL_DO_MAL_FUNCTION,EVAL_MACRO
474432

475433
REM if error, pop and return f for release by caller
476434
GOSUB POP_R
477435
ER=-1:E$="apply of non-function":GOTO EVAL_RETURN
478436

437+
EVAL_MACRO:
438+
REM Apply F to the unevaluated rest of A, then free the memory for F.
439+
AR=Z%(A+1):CALL APPLY
440+
GOSUB POP_Q:AY=Q:GOSUB RELEASE
441+
IF ER<>-2 THEN GOTO EVAL_RETURN
442+
443+
REM Evaluate the result of this macro expansion.
444+
A=R:GOTO EVAL_TCO_RECUR: REM TCO loop
445+
479446
EVAL_DO_FUNCTION:
480447
REM regular function
481448

0 commit comments

Comments
 (0)