Commit | Line | Data |
---|---|---|
ea81a808 JM |
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 | ||
b8ee29b2 JM |
32 | keyword_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 |
52 | string_pr_str () { |
53 | _raw_string_pr_str "${ANON["${1}"]}" "${2}" | |
54 | } | |
55 | ||
ea81a808 JM |
56 | function_pr_str () { r="${ANON["${1}"]}"; } |
57 | ||
b8ee29b2 JM |
58 | bash_pr_str () { |
59 | r="$(declare -f -p ${1})" | |
60 | } | |
61 | ||
ea81a808 JM |
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 | |
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 | ||
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 |