Tests: add testing Dockerfile. Impl fixes.
[jackhill/mal.git] / 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 r="\"${s//\"/\\\"}\""
46 else
47 r="${s}"
48 fi
49 r="${r//__STAR__/$'*'}"
50 }
51
52 string_pr_str () {
53 _raw_string_pr_str "${ANON["${1}"]}" "${2}"
54 }
55
56 function_pr_str () { r="${ANON["${1}"]}"; }
57
58 bash_pr_str () {
59 r="$(declare -f -p ${1})"
60 }
61
62 hash_map_pr_str () {
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}"
69 res="${res} ${r}"
70 eval val="\${${hm}[\"${key}\"]}"
71 _pr_str "${val}" "${print_readably}"
72 res="${res} ${r}"
73 done
74 r="{${res:1}}"
75 }
76
77 vector_pr_str () {
78 local print_readably="${2}"
79 local res=""
80 for elem in ${ANON["${1}"]}; do
81 _pr_str "${elem}" "${print_readably}"
82 res="${res} ${r}"
83 done
84 r="[${res:1}]"
85 }
86
87 list_pr_str () {
88 local print_readably="${2}"
89 local res=""
90 for elem in ${ANON["${1}"]}; do
91 _pr_str "${elem}" "${print_readably}"
92 res="${res} ${r}"
93 done
94 r="(${res:1})"
95 }
96
97 atom_pr_str () {
98 local print_readably="${2}"
99 _pr_str "${ANON["${1}"]}" "${print_readably}"
100 r="(atom ${r})";
101 }
102
103 fi