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 |
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 |
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: |