Basic: variable renaming. Save 2 kbytes.
[jackhill/mal.git] / basic / printer.in.bas
1 REM PR_STR(AZ, PR) -> R$
2 PR_STR:
3 RR$=""
4 PR_STR_RECUR:
5 T=Z%(AZ,0)AND15
6 REM PRINT "AZ: "+STR$(AZ)+", T: "+STR$(T)+", V: "+STR$(Z%(AZ,1))
7 IF T=0 THEN R$="nil":RETURN
8 ON T GOTO PR_BOOLEAN,PR_INTEGER,PR_UNKNOWN,PR_STRING,PR_SYMBOL,PR_SEQ,PR_SEQ,PR_SEQ,PR_FUNCTION,PR_MAL_FUNCTION,PR_MAL_FUNCTION,PR_ATOM,PR_ENV,PR_RECUR,PR_FREE
9
10 PR_UNKNOWN:
11 R$="#<unknown>"
12 RETURN
13 PR_RECUR:
14 AZ=Z%(AZ,1)
15 GOTO PR_STR_RECUR
16 PR_BOOLEAN:
17 R$="true"
18 IF Z%(AZ,1)=0 THEN R$="false"
19 RETURN
20 PR_INTEGER:
21 T5=Z%(AZ,1)
22 R$=STR$(T5)
23 IF T5<0 THEN RETURN
24 REM Remove initial space
25 R$=RIGHT$(R$, LEN(R$)-1)
26 RETURN
27 PR_STRING:
28 IF PR=1 THEN PR_STRING_READABLY
29 R$=S$(Z%(AZ,1))
30 RETURN
31 PR_STRING_READABLY:
32 R$=S$(Z%(AZ,1))
33 S1$=CHR$(92):S2$=CHR$(92)+CHR$(92):GOSUB REPLACE: REM escape backslash
34 S1$=CHR$(34):S2$=CHR$(92)+CHR$(34):GOSUB REPLACE: REM escape quotes
35 S1$=CHR$(13):S2$=CHR$(92)+"n":GOSUB REPLACE: REM escape newlines
36 R$=CHR$(34)+R$+CHR$(34)
37 RETURN
38 PR_SYMBOL:
39 R$=S$(Z%(AZ,1))
40 RETURN
41 PR_SEQ:
42 IF T=6 THEN RR$=RR$+"("
43 IF T=7 THEN RR$=RR$+"["
44 IF T=8 THEN RR$=RR$+"{"
45 REM push the type and where we are in the sequence
46 X=X+2
47 S%(X-1)=T
48 S%(X)=AZ
49 PR_SEQ_LOOP:
50 IF Z%(AZ,1)=0 THEN PR_SEQ_DONE
51 AZ=AZ+1
52 GOSUB PR_STR_RECUR
53 REM if we just rendered a non-sequence, then append it
54 IF T<6 OR T>8 THEN RR$=RR$+R$
55 REM restore current seq type
56 T=S%(X-1)
57 REM Go to next list element
58 AZ=Z%(S%(X),1)
59 S%(X)=AZ
60 IF Z%(AZ,1)<>0 THEN RR$=RR$+" "
61 GOTO PR_SEQ_LOOP
62 PR_SEQ_DONE:
63 REM get type
64 T=S%(X-1)
65 REM pop where we are the sequence and type
66 X=X-2
67 IF T=6 THEN RR$=RR$+")"
68 IF T=7 THEN RR$=RR$+"]"
69 IF T=8 THEN RR$=RR$+"}"
70 R$=RR$
71 RETURN
72 PR_FUNCTION:
73 T1=Z%(AZ,1)
74 R$="#<function"+STR$(T1)+">"
75 RETURN
76 PR_MAL_FUNCTION:
77 T1=AZ
78 AZ=Z%(T1+1,0):GOSUB PR_STR_RECUR
79 T7$="(fn* "+R$
80 AZ=Z%(T1,1):GOSUB PR_STR_RECUR
81 R$=T7$+" "+R$+")"
82 RETURN
83 PR_ATOM:
84 AZ=Z%(AZ,1):GOSUB PR_STR_RECUR
85 R$="(atom "+R$+")"
86 RETURN
87 PR_ENV:
88 R$="#<env"+STR$(AZ)+", data"+STR$(Z%(AZ,1))+">"
89 RETURN
90 PR_FREE:
91 R$="#<free memory "+STR$(AZ)+", next"+STR$(Z%(AZ,1))+">"
92 RETURN
93
94 REM PR_STR_SEQ(AZ, PR, SE$) -> R$
95 PR_STR_SEQ:
96 T9=AZ
97 R1$=""
98 PR_STR_SEQ_LOOP:
99 IF Z%(T9,1)=0 THEN R$=R1$:RETURN
100 AZ=T9+1:GOSUB PR_STR
101 REM goto the next sequence element
102 T9=Z%(T9,1)
103 IF Z%(T9,1)=0 THEN R1$=R1$+R$
104 IF Z%(T9,1)<>0 THEN R1$=R1$+R$+SE$
105 GOTO PR_STR_SEQ_LOOP