REM > printer library for mal in BBC BASIC DEF FNpr_str(val%, print_readably%) LOCAL ret$, term$, val$ IF FNis_nil(val%) THEN ="nil" IF FNis_boolean(val%) THEN IF FNunbox_boolean(val%) THEN ="true" ELSE ="false" ENDIF IF FNis_int(val%) THEN =STR$(FNunbox_int(val%)) IF FNis_string(val%) THEN val$ = FNunbox_string(val%) IF LEFT$(val$, 1) = CHR$(127) THEN =":" + MID$(val$, 2) IF print_readably% THEN =FNformat_string(val$) ELSE =val$ ENDIF IF FNis_symbol(val%) THEN =FNunbox_symbol(val%) IF FNis_corefn(val%) OR FNis_fn(val%) THEN ="#" IF FNis_seq(val%) THEN ret$ = "(" : term$ = ")" IF FNis_vector(val%) THEN ret$ = "[" : term$ = "]" WHILE NOT FNis_empty(val%) IF LEN(ret$) > 1 THEN ret$ += " " ret$ += FNpr_str(FNfirst(val%), print_readably%) val% = FNrest(val%) ENDWHILE =ret$ + term$ ENDIF IF FNis_hashmap(val%) THEN ret$ = "{" WHILE NOT FNis_empty_hashmap(val%) IF LEN(ret$) > 1 THEN ret$ += " " ret$ += FNpr_str(FNalloc_string(FNhashmap_first_key(val%)), print_readably%) ret$ += " " + FNpr_str(FNhashmap_first_val(val%), print_readably%) val% = FNhashmap_rest(val%) ENDWHILE =ret$ + "}" ENDIF IF FNis_atom(val%) THEN ="(atom "+FNpr_str(FNatom_deref(val%), print_readably%)+")" ENDIF ERROR &40E809F0, "Unprintable value" 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$ + """" REM Local Variables: REM indent-tabs-mode: nil REM End: