2 # mal (Make a Lisp) printer
5 if [ -z "${__mal_printer_included__}" ]; then
6 __mal_printer_included
=true
8 source $
(dirname $0)/types.sh
11 local print_readably
="${2}"
12 _obj_type
"${1}"; local ot
="${r}"
13 if [[ -z "${ot}" ]]; then
14 _error
"_pr_str failed on '${1}'"
17 eval ${ot}_pr_str "${1}" "${print_readably}"
21 nil_pr_str () { r="nil
"; }
22 true_pr_str () { r="true
"; }
23 false_pr_str () { r="false
"; }
25 number_pr_str () { r="${ANON["${1}"]}"; }
36 _raw_string_pr_str () {
38 local print_readably="${2}"
39 if [[ "${s:0:1}" = "${__keyw}" ]]; then
41 elif [[ "${s:0:2}" = "${__keyw}" ]]; then
43 elif [ "${print_readably}" == "yes" ]; then
49 r="${r//__STAR__/$'*'}"
53 _raw_string_pr_str "${ANON["${1}"]}" "${2}"
56 function_pr_str () { r="${ANON["${1}"]}"; }
59 r="$
(declare -f -p ${1})"
63 local print_readably="${2}"
64 local res=""; local val=""
65 local hm="${ANON["${1}"]}"
66 eval local keys="\
${!${hm}[@]}"
67 for key in ${keys}; do
68 _raw_string_pr_str "${key}" "${print_readably}"
70 eval val="\
${${hm}[\"${key}\"]}"
71 _pr_str "${val}" "${print_readably}"
78 local print_readably="${2}"
80 for elem in ${ANON["${1}"]}; do
81 _pr_str "${elem}" "${print_readably}"
88 local print_readably="${2}"
90 for elem in ${ANON["${1}"]}; do
91 _pr_str "${elem}" "${print_readably}"
98 local print_readably="${2}"
99 _pr_str "${ANON["${1}"]}" "${print_readably}"