bbc-basic: Add minimal support for keywords (deferred from step 1).
[jackhill/mal.git] / bbc-basic / printer
1 REM > printer library for mal in BBC BASIC
2
3 DEF FNpr_str(val%, print_readably%)
4 LOCAL ret$, val$
5 IF FNis_nil(val%) THEN ="nil"
6 IF FNis_boolean(val%) THEN
7 IF FNunbox_boolean(val%) THEN ="true" ELSE ="false"
8 ENDIF
9 IF FNis_int(val%) THEN =STR$(FNunbox_int(val%))
10 IF FNis_string(val%) THEN
11 val$ = FNunbox_string(val%)
12 IF LEFT$(val$, 1) = CHR$(127) THEN =":" + MID$(val$, 2)
13 IF print_readably% THEN =FNformat_string(val$) ELSE =val$
14 ENDIF
15 IF FNis_symbol(val%) THEN =FNunbox_symbol(val%)
16 IF FNis_corefn(val%) OR FNis_fn(val%) THEN ="#<function>"
17 IF FNis_list(val%) THEN
18 ret$ = "("
19 WHILE NOT FNis_empty(val%)
20 IF LEN(ret$) > 1 THEN ret$ += " "
21 ret$ += FNpr_str(FNlist_car(val%), print_readably%)
22 val% = FNlist_cdr(val%)
23 ENDWHILE
24 =ret$ + ")"
25 ENDIF
26 IF FNis_atom(val%) THEN
27 ="(atom "+FNpr_str(FNatom_deref(val%), print_readably%)+")"
28 ENDIF
29 ERROR &40E809F0, "Unprintable value"
30
31 DEF FNformat_string(strval$)
32 LOCAL ptr%, c$, out$
33 IF strval$ = "" THEN =""""""
34 FOR ptr% = 1 TO LEN(strval$)
35 c$ = MID$(strval$, ptr%, 1)
36 CASE c$ OF
37 WHEN "\", """": out$ += "\" + c$
38 WHEN CHR$(10): out$ += "\n"
39 OTHERWISE: out$ += c$
40 ENDCASE
41 NEXT ptr%
42 ="""" + out$ + """"
43
44 REM Local Variables:
45 REM indent-tabs-mode: nil
46 REM End: