# # mal (Make a Lisp) printer # if test -z $(__mal_printer_included__) { setglobal __mal_printer_included = 'true' source $[dirname $0]/types.sh proc _pr_str { var print_readably = $(2) _obj_type $(1); var ot = $(r) if [[ -z "${ot}" ]] { _error "_pr_str failed on '$(1)'" setglobal r = ""<$(1)>"" } else { eval $(ot)_pr_str $(1) $(print_readably) } } proc nil_pr_str { setglobal r = '"nil'"; } proc true_pr_str { setglobal r = '"true'"; } proc false_pr_str { setglobal r = '"false'"; } proc number_pr_str { setglobal r = $(ANON["${1}"]); } proc symbol_pr_str { setglobal r = $(ANON["${1}"]) setglobal r = $(r//__STAR__/*) } proc keyword_pr_str { string_pr_str $(1) } proc _raw_string_pr_str { var s = $(1) var print_readably = $(2) if [[ "${s:0:1}" = "${__keyw}" ]] { setglobal r = "":$(s:1)"" } elif [[ "${s:0:2}" = "${__keyw}" ]] { setglobal r = "":$(s:2)"" } elif test $(print_readably) == "yes" { set s = $(s//\\/\\\\) set s = $(s//\"/\\\") setglobal r = ""\"$(s//$'\n'/\\n)"\"" } else { setglobal r = $(s) } setglobal r = $(r//__STAR__/$'*') } proc string_pr_str { _raw_string_pr_str $(ANON["${1}"]) $(2) } proc function_pr_str { setglobal r = $(ANON["${1}"]); } proc bash_pr_str { setglobal r = $[declare -f -p $(1)] } proc hash_map_pr_str { var print_readably = $(2) var res = ''""; var val = ''"" var hm = $(ANON["${1}"]) eval local keys="\${!$(hm)[@]}" for key in [$(keys)] { _raw_string_pr_str $(key) $(print_readably) set res = ""$(res) $(r)"" eval val="\${$(hm)[\"$(key)\"]}" _pr_str $(val) $(print_readably) set res = ""$(res) $(r)"" } setglobal r = ""{$(res:1)}"" } proc vector_pr_str { var print_readably = $(2) var res = ''"" for elem in [$(ANON["${1}"])] { _pr_str $(elem) $(print_readably) set res = ""$(res) $(r)"" } setglobal r = ""[$(res:1)]"" } proc list_pr_str { var print_readably = $(2) var res = ''"" for elem in [$(ANON["${1}"])] { _pr_str $(elem) $(print_readably) set res = ""$(res) $(r)"" } setglobal r = ""($(res:1))"" } proc atom_pr_str { var print_readably = $(2) _pr_str $(ANON["${1}"]) $(print_readably) setglobal r = ""(atom $(r))""; } }