2019-04-20 01:33:31 +01:00
|
|
|
REM > printer library for mal in BBC BASIC
|
2019-03-31 22:44:13 +01:00
|
|
|
|
2019-04-20 13:42:00 +01:00
|
|
|
DEF FNpr_str(val%, print_readably%)
|
2019-05-18 22:28:13 +01:00
|
|
|
LOCAL ret%, term$, val$, keys%, vals%
|
|
|
|
|
IF FNis_nil(val%) THEN =FNalloc_string("nil")
|
2019-04-07 11:01:11 +01:00
|
|
|
IF FNis_boolean(val%) THEN
|
2019-05-18 22:28:13 +01:00
|
|
|
IF FNunbox_boolean(val%) THEN =FNalloc_string("true")
|
|
|
|
|
=FNalloc_string("false")
|
2019-04-07 11:01:11 +01:00
|
|
|
ENDIF
|
2019-05-18 22:28:13 +01:00
|
|
|
IF FNis_int(val%) THEN =FNalloc_string(STR$(FNunbox_int(val%)))
|
2019-04-20 13:44:12 +01:00
|
|
|
IF FNis_string(val%) THEN
|
2019-05-18 22:28:13 +01:00
|
|
|
IF FNstring_chr(val%, 1) = CHR$(127) THEN =FNalloc_string(":" + MID$(FNunbox_string(val%), 2))
|
|
|
|
|
IF print_readably% THEN =FNalloc_string(FNformat_string(FNunbox_string(val%))) ELSE =val%
|
2019-04-20 13:44:12 +01:00
|
|
|
ENDIF
|
2019-05-18 22:28:13 +01:00
|
|
|
IF FNis_symbol(val%) THEN =FNalloc_string(FNunbox_symbol(val%))
|
|
|
|
|
IF FNis_corefn(val%) OR FNis_fn(val%) THEN =FNalloc_string("#<function>")
|
2019-05-05 23:52:31 +01:00
|
|
|
IF FNis_seq(val%) THEN
|
2019-05-26 13:38:25 +01:00
|
|
|
IF FNis_vector(val%) THEN
|
|
|
|
|
ret% = FNalloc_string("[") : term$ = "]"
|
|
|
|
|
ELSE
|
|
|
|
|
ret% = FNalloc_string("(") : term$ = ")"
|
|
|
|
|
ENDIF
|
2019-03-31 22:44:13 +01:00
|
|
|
WHILE NOT FNis_empty(val%)
|
2019-05-27 12:51:20 +01:00
|
|
|
IF FNstring_len(ret%) > 1 THEN ret% = FNstring_append(ret%, " ")
|
|
|
|
|
ret% = FNstring_concat(ret%, FNpr_str(FNfirst(val%), print_readably%))
|
2019-05-06 12:00:25 +01:00
|
|
|
val% = FNrest(val%)
|
2019-03-31 22:44:13 +01:00
|
|
|
ENDWHILE
|
2019-05-27 12:51:20 +01:00
|
|
|
=FNstring_append(ret%, term$)
|
2019-03-31 22:44:13 +01:00
|
|
|
ENDIF
|
2019-05-11 16:47:12 +01:00
|
|
|
IF FNis_hashmap(val%) THEN
|
2019-05-18 22:28:13 +01:00
|
|
|
ret% = FNalloc_string("{")
|
2019-05-12 11:19:03 +01:00
|
|
|
keys% = FNhashmap_keys(val%)
|
2019-05-18 22:28:13 +01:00
|
|
|
vals% = FNhashmap_vals(val%)
|
2019-05-12 11:19:03 +01:00
|
|
|
WHILE NOT FNis_empty(keys%)
|
2019-05-27 12:51:20 +01:00
|
|
|
IF FNstring_len(ret%) > 1 THEN ret% = FNstring_append(ret%, " ")
|
|
|
|
|
ret% = FNstring_concat(ret%, FNpr_str(FNfirst(keys%), print_readably%))
|
|
|
|
|
ret% = FNstring_append(ret%, " ")
|
|
|
|
|
ret% = FNstring_concat(ret%, FNpr_str(FNfirst(vals%), print_readably%))
|
2019-05-12 11:19:03 +01:00
|
|
|
keys% = FNrest(keys%)
|
2019-05-18 22:28:13 +01:00
|
|
|
vals% = FNrest(vals%)
|
2019-05-11 16:47:12 +01:00
|
|
|
ENDWHILE
|
2019-05-27 12:51:20 +01:00
|
|
|
=FNstring_append(ret%, "}")
|
2019-05-11 16:47:12 +01:00
|
|
|
ENDIF
|
2019-04-20 18:25:09 +01:00
|
|
|
IF FNis_atom(val%) THEN
|
2019-05-18 22:28:13 +01:00
|
|
|
ret% = FNalloc_string("(atom ")
|
2019-05-27 12:51:20 +01:00
|
|
|
ret% = FNstring_concat(ret%, FNpr_str(FNatom_deref(val%), print_readably%))
|
|
|
|
|
=FNstring_append(ret%, ")")
|
2019-04-20 18:25:09 +01:00
|
|
|
ENDIF
|
2019-04-07 11:02:20 +01:00
|
|
|
ERROR &40E809F0, "Unprintable value"
|
2019-04-19 17:44:19 +01:00
|
|
|
|
2019-04-20 13:44:12 +01:00
|
|
|
DEF FNformat_string(strval$)
|
|
|
|
|
LOCAL ptr%, c$, out$
|
|
|
|
|
IF strval$ = "" THEN =""""""
|
|
|
|
|
FOR ptr% = 1 TO LEN(strval$)
|
|
|
|
|
c$ = MID$(strval$, ptr%, 1)
|
|
|
|
|
CASE c$ OF
|
|
|
|
|
WHEN "\", """": out$ += "\" + c$
|
|
|
|
|
WHEN CHR$(10): out$ += "\n"
|
|
|
|
|
OTHERWISE: out$ += c$
|
|
|
|
|
ENDCASE
|
|
|
|
|
NEXT ptr%
|
|
|
|
|
="""" + out$ + """"
|
|
|
|
|
|
2019-04-19 17:44:19 +01:00
|
|
|
REM Local Variables:
|
|
|
|
|
REM indent-tabs-mode: nil
|
|
|
|
|
REM End:
|