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