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 | ||
32 | string_pr_str () { | |
33 | local print_readably="${2}" | |
34 | if [ "${print_readably}" == "yes" ]; then | |
35 | local s="${ANON["${1}"]}" | |
36 | s="${s//\\/\\\\}" | |
37 | r="\"${s//\"/\\\"}\"" | |
38 | else | |
39 | r="${ANON["${1}"]}" | |
40 | fi | |
41 | r="${r//__STAR__/$'*'}" | |
42 | } | |
43 | ||
44 | function_pr_str () { r="${ANON["${1}"]}"; } | |
45 | ||
46 | hash_map_pr_str () { | |
47 | local print_readably="${2}" | |
48 | local res=""; local val="" | |
49 | local hm="${ANON["${1}"]}" | |
50 | eval local keys="\${!${hm}[@]}" | |
51 | for key in ${keys}; do | |
52 | #res="${res} \"${ANON["${key}"]}\"" | |
53 | res="${res} \"${key//__STAR__/$'*'}\"" | |
54 | eval val="\${${hm}[\"${key}\"]}" | |
55 | _pr_str "${val}" "${print_readably}" | |
56 | res="${res} ${r}" | |
57 | done | |
58 | r="{${res:1}}" | |
59 | } | |
60 | ||
61 | vector_pr_str () { | |
62 | local print_readably="${2}" | |
63 | local res="" | |
64 | for elem in ${ANON["${1}"]}; do | |
65 | _pr_str "${elem}" "${print_readably}" | |
66 | res="${res} ${r}" | |
67 | done | |
68 | r="[${res:1}]" | |
69 | } | |
70 | ||
71 | list_pr_str () { | |
72 | local print_readably="${2}" | |
73 | local res="" | |
74 | for elem in ${ANON["${1}"]}; do | |
75 | _pr_str "${elem}" "${print_readably}" | |
76 | res="${res} ${r}" | |
77 | done | |
78 | r="(${res:1})" | |
79 | } | |
80 | ||
81 | atom_pr_str () { | |
82 | local print_readably="${2}" | |
83 | _pr_str "${ANON["${1}"]}" "${print_readably}" | |
84 | r="(atom ${r})"; | |
85 | } | |
86 | ||
87 | fi |