RETURN
REM EVAL_AST(A, E) -> R
-EVAL_AST:
+SUB EVAL_AST
LV=LV+1
REM push A and E on the stack
GOTO EVAL_AST_RETURN
EVAL_AST_SYMBOL:
- K=A:GOSUB ENV_GET
+ K=A:GOTO ENV_GET
+ ENV_GET_RETURN:
GOTO EVAL_AST_RETURN
EVAL_AST_SEQ:
EVAL_AST_DO_EVAL:
REM call EVAL for each entry
- A=A+1:GOSUB EVAL
+ A=A+1:CALL EVAL
A=A-1
GOSUB DEREF_R: REM deref to target of evaluated entry
E=X%(X-1):A=X%(X):X=X-2
LV=LV-1
- RETURN
+END SUB
-REM EVAL(A, E)) -> R
-EVAL:
+REM EVAL(A, E) -> R
+SUB EVAL
LV=LV+1: REM track basic return stack level
REM push A and E on the stack
GOSUB LIST_Q
IF R THEN GOTO APPLY_LIST
REM ELSE
- GOSUB EVAL_AST
+ CALL EVAL_AST
GOTO EVAL_RETURN
APPLY_LIST:
GOSUB EVAL_GET_A2: REM set A1 and A2
X=X+1:X%(X)=A1: REM push A1
- A=A2:GOSUB EVAL: REM eval a2
+ A=A2:CALL EVAL: REM eval a2
A1=X%(X):X=X-1: REM pop A1
IF ER<>-2 THEN GOTO EVAL_RETURN
X=X+1:X%(X)=A1: REM push A1
REM eval current A1 odd element
- A=Z%(A1,1)+1:GOSUB EVAL
+ A=Z%(A1,1)+1:CALL EVAL
A1=X%(X):X=X-1: REM pop A1
REM set environment: even A1 key to odd A1 eval'd above
EVAL_LET_LOOP_DONE:
A2=X%(X):X=X-1: REM pop A2
- A=A2:GOSUB EVAL: REM eval A2 using let_env
+ A=A2:CALL EVAL: REM eval A2 using let_env
GOTO EVAL_RETURN
EVAL_INVOKE:
- GOSUB EVAL_AST
+ CALL EVAL_AST
R3=R
REM if error, return f/args for release by caller
REM pop A and E off the stack
E=X%(X-1):A=X%(X):X=X-2
- RETURN
+END SUB
REM DO_FUNCTION(F, AR)
DO_FUNCTION:
REM REP(A$) -> R$
REM Assume D has repl_env
-REP:
+SUB REP
R1=0:R2=0
GOSUB MAL_READ
R1=R
IF ER<>-2 THEN GOTO REP_DONE
- A=R:E=D:GOSUB EVAL
+ A=R:E=D:CALL EVAL
R2=R
IF ER<>-2 THEN GOTO REP_DONE
IF R2<>0 THEN AY=R2:GOSUB RELEASE
IF R1<>0 THEN AY=R1:GOSUB RELEASE
R$=RT$
- RETURN
+END SUB
REM MAIN program
MAIN:
A$="user> ":GOSUB READLINE: REM call input parser
IF EOF=1 THEN GOTO QUIT
- A$=R$:GOSUB REP: REM call REP
+ A$=R$:CALL REP: REM call REP
IF ER<>-2 THEN GOSUB PRINT_ERROR:GOTO REPL_LOOP
PRINT R$