Merge pull request #514 from alimpfard/jq-fix
[jackhill/mal.git] / impls / bash / printer.sh
1 #
2 # mal (Make a Lisp) printer
3 #
4
5 if [ -z "${__mal_printer_included__}" ]; then
6 __mal_printer_included=true
7
8 source $(dirname $0)/types.sh
9
10 _pr_str () {
11 local print_readably="${2}"
12 _obj_type "${1}"; local ot="${r}"
13 if [[ -z "${ot}" ]]; then
14 _error "_pr_str failed on '${1}'"
15 r="<${1}>"
16 else
17 eval ${ot}_pr_str "${1}" "${print_readably}"
18 fi
19 }
20
21 nil_pr_str () { r="nil"; }
22 true_pr_str () { r="true"; }
23 false_pr_str () { r="false"; }
24
25 number_pr_str () { r="${ANON["${1}"]}"; }
26
27 symbol_pr_str () {
28 r="${ANON["${1}"]}"
29 r="${r//__STAR__/*}"
30 }
31
32 keyword_pr_str () {
33 string_pr_str "${1}"
34 }
35
36 _raw_string_pr_str () {
37 local s="${1}"
38 local print_readably="${2}"
39 if [[ "${s:0:1}" = "${__keyw}" ]]; then
40 r=":${s:1}"
41 elif [[ "${s:0:2}" = "${__keyw}" ]]; then
42 r=":${s:2}"
43 elif [ "${print_readably}" == "yes" ]; then
44 s="${s//\\/\\\\}"
45 s="${s//\"/\\\"}"
46 r="\"${s//$'\n'/\\n}\""
47 else
48 r="${s}"
49 fi
50 r="${r//__STAR__/$'*'}"
51 }
52
53 string_pr_str () {
54 _raw_string_pr_str "${ANON["${1}"]}" "${2}"
55 }
56
57 function_pr_str () { r="${ANON["${1}"]}"; }
58
59 bash_pr_str () {
60 r="$(declare -f -p ${1})"
61 }
62
63 hash_map_pr_str () {
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}"
70 res="${res} ${r}"
71 eval val="\${${hm}[\"${key}\"]}"
72 _pr_str "${val}" "${print_readably}"
73 res="${res} ${r}"
74 done
75 r="{${res:1}}"
76 }
77
78 vector_pr_str () {
79 local print_readably="${2}"
80 local res=""
81 for elem in ${ANON["${1}"]}; do
82 _pr_str "${elem}" "${print_readably}"
83 res="${res} ${r}"
84 done
85 r="[${res:1}]"
86 }
87
88 list_pr_str () {
89 local print_readably="${2}"
90 local res=""
91 for elem in ${ANON["${1}"]}; do
92 _pr_str "${elem}" "${print_readably}"
93 res="${res} ${r}"
94 done
95 r="(${res:1})"
96 }
97
98 atom_pr_str () {
99 local print_readably="${2}"
100 _pr_str "${ANON["${1}"]}" "${print_readably}"
101 r="(atom ${r})";
102 }
103
104 fi