Basic: Add memory management. More step4.
[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%=14 THEN AZ%=Z%(AZ%,1): GOTO PR_STR_RECUR
8 IF T%=0 THEN R$="nil": RETURN
9 IF (T%=1) AND (Z%(AZ%,1)=0) THEN R$="false": RETURN
10 IF (T%=1) AND (Z%(AZ%,1)=1) THEN R$="true": RETURN
11 IF T%=2 THEN PR_INTEGER
12 IF (T%=4) AND (PR%=0) THEN PR_STRING
13 IF (T%=4) AND (PR%=1) THEN PR_STRING_READABLY
14 IF T%=5 THEN PR_SYMBOL
15 IF T%=6 THEN PR_SEQ
16 IF T%=7 THEN PR_SEQ
17 IF T%=8 THEN PR_SEQ
18 IF T%=9 THEN PR_FUNCTION
19 IF T%=10 THEN PR_MAL_FUNCTION
20 R$="#<unknown>"
21 RETURN
22
23 PR_INTEGER:
24 T5%=Z%(AZ%,1)
25 R$=STR$(T5%)
26 IF T5%<0 THEN RETURN
27 REM Remove initial space
28 R$=RIGHT$(R$, LEN(R$)-1)
29 RETURN
30 PR_STRING:
31 R$=ZS$(Z%(AZ%,1))
32 RETURN
33 PR_STRING_READABLY:
34 R$=CHR$(34) + ZS$(Z%(AZ%,1)) + CHR$(34)
35 RETURN
36 PR_SYMBOL:
37 R$=ZS$(Z%(AZ%,1))
38 RETURN
39 PR_SEQ:
40 IF T%=6 THEN RR$=RR$+"("
41 IF T%=7 THEN RR$=RR$+"["
42 IF T%=8 THEN RR$=RR$+"{"
43 REM push where we are in the sequence
44 ZL%=ZL%+1
45 ZZ%(ZL%)= AZ%
46 PR_SEQ_LOOP:
47 IF Z%(AZ%,1) = 0 THEN PR_SEQ_DONE
48 AZ%=AZ%+1
49 REM Push type we are rendering on the stack
50 ZL%=ZL%+1
51 ZZ%(ZL%) = Z%(AZ%,0)AND15
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 pop type off stack and check it
56 T%=ZZ%(ZL%)
57 ZL%=ZL%-1
58 REM Go to next list element
59 AZ%=Z%(ZZ%(ZL%),1)
60 ZZ%(ZL%) = AZ%
61 IF Z%(AZ%,1) <> 0 THEN RR$=RR$+" "
62 GOTO PR_SEQ_LOOP
63 PR_SEQ_DONE:
64 REM get current type
65 T%=Z%(ZZ%(ZL%),0)AND15
66 REM pop where we are the sequence
67 ZL%=ZL%-1
68 IF T%=6 THEN RR$=RR$+")"
69 IF T%=7 THEN RR$=RR$+"]"
70 IF T%=8 THEN RR$=RR$+"}"
71 R$=RR$
72 RETURN
73 PR_FUNCTION:
74 T1%=Z%(AZ%,1)
75 R$="#<function" + STR$(T1%) + ">"
76 RETURN
77 PR_MAL_FUNCTION:
78 T1%=AZ%
79 AZ%=Z%(T1%+1,0): GOSUB PR_STR_RECUR
80 T7$="(fn* " + R$
81 AZ%=Z%(T1%,1): GOSUB PR_STR_RECUR
82 R$=T7$ + " " + R$ + ")"
83 RETURN
84
85 REM PR_STR_SEQ(AZ%, PR%, SE$) -> R$
86 PR_STR_SEQ:
87 T9%=AZ%
88 R1$=""
89 PR_STR_SEQ_LOOP:
90 IF Z%(T9%,1)=0 THEN R$=R1$: RETURN
91 AZ%=T9%+1: GOSUB PR_STR
92 REM goto the next sequence element
93 T9%=Z%(T9%,1)
94 IF Z%(T9%,1)=0 THEN R1$=R1$+R$
95 IF Z%(T9%,1)<>0 THEN R1$=R1$+R$+SE$
96 GOTO PR_STR_SEQ_LOOP