Travis: split build and test into separate scripts.
[jackhill/mal.git] / bash / printer.sh
CommitLineData
ea81a808
JM
1#
2# mal (Make a Lisp) printer
3#
4
5if [ -z "${__mal_printer_included__}" ]; then
6__mal_printer_included=true
7
8source $(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
21nil_pr_str () { r="nil"; }
22true_pr_str () { r="true"; }
23false_pr_str () { r="false"; }
24
25number_pr_str () { r="${ANON["${1}"]}"; }
26
27symbol_pr_str () {
28 r="${ANON["${1}"]}"
29 r="${r//__STAR__/*}"
30}
31
b8ee29b2
JM
32keyword_pr_str () {
33 string_pr_str "${1}"
34}
35
36_raw_string_pr_str () {
37 local s="${1}"
ea81a808 38 local print_readably="${2}"
b8ee29b2
JM
39 if [[ "${s:0:1}" = "${__keyw}" ]]; then
40 r=":${s:1}"
c9de2e82
JM
41 elif [[ "${s:0:2}" = "${__keyw}" ]]; then
42 r=":${s:2}"
b8ee29b2 43 elif [ "${print_readably}" == "yes" ]; then
ea81a808
JM
44 s="${s//\\/\\\\}"
45 r="\"${s//\"/\\\"}\""
46 else
b8ee29b2 47 r="${s}"
ea81a808
JM
48 fi
49 r="${r//__STAR__/$'*'}"
50}
51
b8ee29b2
JM
52string_pr_str () {
53 _raw_string_pr_str "${ANON["${1}"]}" "${2}"
54}
55
ea81a808
JM
56function_pr_str () { r="${ANON["${1}"]}"; }
57
b8ee29b2
JM
58bash_pr_str () {
59 r="$(declare -f -p ${1})"
60}
61
ea81a808
JM
62hash_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
b8ee29b2
JM
68 _raw_string_pr_str "${key}" "${print_readably}"
69 res="${res} ${r}"
ea81a808
JM
70 eval val="\${${hm}[\"${key}\"]}"
71 _pr_str "${val}" "${print_readably}"
72 res="${res} ${r}"
73 done
74 r="{${res:1}}"
75}
76
77vector_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
87list_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
97atom_pr_str () {
98 local print_readably="${2}"
99 _pr_str "${ANON["${1}"]}" "${print_readably}"
100 r="(atom ${r})";
101}
102
103fi