DISABLE FDs (REMOVE ME).
[jackhill/mal.git] / bbc-basic / printer.bas
CommitLineData
49c172c0 1REM > printer library for mal in BBC BASIC
ca23e632 2
f17ed797 3DEF FNpr_str(val%, print_readably%)
0f97a00d
BH
4 LOCAL ret%, term$, val$, keys%, vals%
5 IF FNis_nil(val%) THEN =FNalloc_string("nil")
3ab6b58b 6 IF FNis_boolean(val%) THEN
0f97a00d
BH
7 IF FNunbox_boolean(val%) THEN =FNalloc_string("true")
8 =FNalloc_string("false")
3ab6b58b 9 ENDIF
0f97a00d 10 IF FNis_int(val%) THEN =FNalloc_string(STR$(FNunbox_int(val%)))
68f0184e 11 IF FNis_string(val%) THEN
0f97a00d
BH
12 IF FNstring_chr(val%, 1) = CHR$(127) THEN =FNalloc_string(":" + MID$(FNunbox_string(val%), 2))
13 IF print_readably% THEN =FNalloc_string(FNformat_string(FNunbox_string(val%))) ELSE =val%
68f0184e 14 ENDIF
0f97a00d
BH
15 IF FNis_symbol(val%) THEN =FNalloc_string(FNunbox_symbol(val%))
16 IF FNis_corefn(val%) OR FNis_fn(val%) THEN =FNalloc_string("#<function>")
9152704f 17 IF FNis_seq(val%) THEN
d1d06889
BH
18 IF FNis_vector(val%) THEN
19 ret% = FNalloc_string("[") : term$ = "]"
20 ELSE
21 ret% = FNalloc_string("(") : term$ = ")"
22 ENDIF
ca23e632 23 WHILE NOT FNis_empty(val%)
e55d7a2d
BH
24 IF FNstring_len(ret%) > 1 THEN ret% = FNstring_append(ret%, " ")
25 ret% = FNstring_concat(ret%, FNpr_str(FNfirst(val%), print_readably%))
f14770fc 26 val% = FNrest(val%)
ca23e632 27 ENDWHILE
e55d7a2d 28 =FNstring_append(ret%, term$)
ca23e632 29 ENDIF
b6e4898c 30 IF FNis_hashmap(val%) THEN
0f97a00d 31 ret% = FNalloc_string("{")
90f6b7a2 32 keys% = FNhashmap_keys(val%)
0f97a00d 33 vals% = FNhashmap_vals(val%)
90f6b7a2 34 WHILE NOT FNis_empty(keys%)
e55d7a2d
BH
35 IF FNstring_len(ret%) > 1 THEN ret% = FNstring_append(ret%, " ")
36 ret% = FNstring_concat(ret%, FNpr_str(FNfirst(keys%), print_readably%))
37 ret% = FNstring_append(ret%, " ")
38 ret% = FNstring_concat(ret%, FNpr_str(FNfirst(vals%), print_readably%))
90f6b7a2 39 keys% = FNrest(keys%)
0f97a00d 40 vals% = FNrest(vals%)
b6e4898c 41 ENDWHILE
e55d7a2d 42 =FNstring_append(ret%, "}")
b6e4898c 43 ENDIF
940092c6 44 IF FNis_atom(val%) THEN
0f97a00d 45 ret% = FNalloc_string("(atom ")
e55d7a2d
BH
46 ret% = FNstring_concat(ret%, FNpr_str(FNatom_deref(val%), print_readably%))
47 =FNstring_append(ret%, ")")
940092c6 48 ENDIF
9809aa65 49 ERROR &40E809F0, "Unprintable value"
dd3d5ad7 50
68f0184e
BH
51DEF FNformat_string(strval$)
52 LOCAL ptr%, c$, out$
53 IF strval$ = "" THEN =""""""
54 FOR ptr% = 1 TO LEN(strval$)
55 c$ = MID$(strval$, ptr%, 1)
56 CASE c$ OF
57 WHEN "\", """": out$ += "\" + c$
58 WHEN CHR$(10): out$ += "\n"
59 OTHERWISE: out$ += c$
60 ENDCASE
61 NEXT ptr%
62="""" + out$ + """"
63
dd3d5ad7
BH
64REM Local Variables:
65REM indent-tabs-mode: nil
66REM End: