1 REM > printer library for mal in BBC BASIC
3 DEF
FNpr_str(val
%, print_readably
%)
4 LOCAL ret
%, term
$, val
$, keys
%, vals
%
5 IF FNis_nil(val
%) THEN =FNalloc_string("nil")
6 IF FNis_boolean(val
%) THEN
7 IF FNunbox_boolean(val
%) THEN =FNalloc_string("true")
8 =FNalloc_string("false")
10 IF FNis_int(val
%) THEN =FNalloc_string(STR
$(FNunbox_int(val%)))
11 IF FNis_string(val
%) THEN
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
%
15 IF FNis_symbol(val
%) THEN =FNalloc_string(FNunbox_symbol(val
%))
16 IF FNis_corefn(val
%) OR FNis_fn(val
%) THEN =FNalloc_string("#<function>")
17 IF FNis_seq(val
%) THEN
18 IF FNis_vector(val
%) THEN
19 ret
% = FNalloc_string("[") : term$
= "]"
21 ret
% = FNalloc_string("(") : term$
= ")"
23 WHILE NOT FNis_empty(val
%)
24 IF FNstring_len(ret
%) > 1 THEN ret
% = FNstring_append(ret
%, " ")
25 ret
% = FNstring_concat(ret
%, FNpr_str(FNfirst(val
%), print_readably
%))
28 =FNstring_append(ret
%, term
$)
30 IF FNis_hashmap(val
%) THEN
31 ret
% = FNalloc_string("{")
32 keys
% = FNhashmap_keys(val
%)
33 vals
% = FNhashmap_vals(val
%)
34 WHILE NOT FNis_empty(keys
%)
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
%))
42 =FNstring_append(ret
%, "}")
44 IF FNis_atom(val
%) THEN
45 ret
% = FNalloc_string("(atom ")
46 ret
% = FNstring_concat(ret
%, FNpr_str(FNatom_deref(val
%), print_readably
%))
47 =FNstring_append(ret
%, ")")
49 ERROR &40E809F0
, "Unprintable value"
51 DEF
FNformat_string(strval
$)
53 IF strval$
= "" THEN =""""""
54 FOR ptr
% = 1 TO LEN(strval
$)
55 c$
= MID$(strval$, ptr
%, 1)
57 WHEN
"\", """": out$
+= "\" + c$
58 WHEN CHR
$(10): out$
+= "\n"
65 REM indent-tabs-mode: nil