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
46 r="\"${s//$'\n'/\\n}\""
50 r="${r//__STAR__/$'*'}"
54 _raw_string_pr_str "${ANON["${1}"]}" "${2}"
57 function_pr_str () { r="${ANON["${1}"]}"; }
60 r="$
(declare -f -p ${1})"
64 local print_readably="${2}"
65 local res=""; local val=""
66 local hm="${ANON["${1}"]}"
67 eval local keys="\
${!${hm}[@]}"
68 for key in ${keys}; do
69 _raw_string_pr_str "${key}" "${print_readably}"
71 eval val="\
${${hm}[\"${key}\"]}"
72 _pr_str "${val}" "${print_readably}"
79 local print_readably="${2}"
81 for elem in ${ANON["${1}"]}; do
82 _pr_str "${elem}" "${print_readably}"
89 local print_readably="${2}"
91 for elem in ${ANON["${1}"]}; do
92 _pr_str "${elem}" "${print_readably}"
99 local print_readably="${2}"
100 _pr_str "${ANON["${1}"]}" "${print_readably}"