Commit | Line | Data |
---|---|---|
49c172c0 | 1 | REM > printer library for mal in BBC BASIC |
ca23e632 | 2 | |
f17ed797 | 3 | DEF 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 |
0f97a00d BH |
18 | ret% = FNalloc_string("(") : term$ = ")" |
19 | IF FNis_vector(val%) THEN ret% = FNalloc_string("[") : term$ = "]" | |
ca23e632 | 20 | WHILE NOT FNis_empty(val%) |
0f97a00d BH |
21 | IF FNstring_len(ret%) > 1 THEN PROCstring_append(ret%, " ") |
22 | PROCstring_concat(ret%, FNpr_str(FNfirst(val%), print_readably%)) | |
f14770fc | 23 | val% = FNrest(val%) |
ca23e632 | 24 | ENDWHILE |
0f97a00d BH |
25 | PROCstring_append(ret%, term$) |
26 | =ret% | |
ca23e632 | 27 | ENDIF |
b6e4898c | 28 | IF FNis_hashmap(val%) THEN |
0f97a00d | 29 | ret% = FNalloc_string("{") |
90f6b7a2 | 30 | keys% = FNhashmap_keys(val%) |
0f97a00d | 31 | vals% = FNhashmap_vals(val%) |
90f6b7a2 | 32 | WHILE NOT FNis_empty(keys%) |
0f97a00d BH |
33 | IF FNstring_len(ret%) > 1 THEN PROCstring_append(ret%, " ") |
34 | PROCstring_concat(ret%, FNpr_str(FNfirst(keys%), print_readably%)) | |
35 | PROCstring_append(ret%, " ") | |
36 | PROCstring_concat(ret%, FNpr_str(FNfirst(vals%), print_readably%)) | |
90f6b7a2 | 37 | keys% = FNrest(keys%) |
0f97a00d | 38 | vals% = FNrest(vals%) |
b6e4898c | 39 | ENDWHILE |
0f97a00d BH |
40 | PROCstring_append(ret%, "}") |
41 | =ret% | |
b6e4898c | 42 | ENDIF |
940092c6 | 43 | IF FNis_atom(val%) THEN |
0f97a00d BH |
44 | ret% = FNalloc_string("(atom ") |
45 | PROCstring_concat(ret%, FNpr_str(FNatom_deref(val%), print_readably%)) | |
46 | PROCstring_append(ret%, ")") | |
47 | =ret% | |
940092c6 | 48 | ENDIF |
9809aa65 | 49 | ERROR &40E809F0, "Unprintable value" |
dd3d5ad7 | 50 | |
68f0184e BH |
51 | DEF 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 |
64 | REM Local Variables: |
65 | REM indent-tabs-mode: nil | |
66 | REM End: |