3 source $
(dirname $0)/reader.sh
4 source $
(dirname $0)/printer.sh
5 source $
(dirname $0)/env.sh
9 [ "${1}" ] && r
="${1}" || READLINE
15 local ast
="${1}" env
="${2}"
16 #_pr_str "${ast}"; echo "EVAL_AST '${ast}:${r} / ${env}'"
17 _obj_type
"${ast}"; local ot
="${r}"
20 ENV_GET
"${env}" "${ast}"
23 _map_with_type _list EVAL
"${ast}" "${env}" ;;
25 _map_with_type _vector EVAL
"${ast}" "${env}" ;;
27 local res
="" key
= val
="" hm
="${ANON["${ast}"]}"
28 _hash_map
; local new_hm
="${r}"
29 eval local keys
="\${!${hm}[@]}"
30 for key
in ${keys}; do
31 eval val
="\${${hm}[\"${key}\"]}"
32 EVAL
"${val}" "${env}"
33 _assoc
! "${new_hm}" "${key}" "${r}"
42 local ast
="${1}" env
="${2}"
44 [[ "${__ERROR}" ]] && return 1
45 #_pr_str "${ast}"; echo "EVAL '${r} / ${env}'"
46 _obj_type
"${ast}"; local ot
="${r}"
47 if [[ "${ot}" != "list" ]]; then
48 EVAL_AST
"${ast}" "${env}"
53 _nth
"${ast}" 0; local a0
="${r}"
54 _nth
"${ast}" 1; local a1
="${r}"
55 _nth
"${ast}" 2; local a2
="${r}"
56 case "${ANON["${a0}"]}" in
57 def
!) EVAL
"${a2}" "${env}"
58 [[ "${__ERROR}" ]] && return 1
59 ENV_SET
"${env}" "${a1}" "${r}"
61 let*) ENV
"${env}"; local let_env
="${r}"
62 local let_pairs
=(${ANON["${a1}"]})
64 #echo "let: [${let_pairs[*]}] for ${a2}"
65 while [[ "${let_pairs["${idx}"]}" ]]; do
66 EVAL
"${let_pairs[$(( idx + 1))]}" "${let_env}"
67 ENV_SET
"${let_env}" "${let_pairs[${idx}]}" "${r}"
70 EVAL
"${a2}" "${let_env}"
72 *) EVAL_AST
"${ast}" "${env}"
73 [[ "${__ERROR}" ]] && r
= && return 1
75 _first
"${el}"; local f
="${r}"
76 _rest
"${el}"; local args="${ANON["${r}"]}"
77 #echo "invoke: ${f} ${args}"
85 if [[ "${__ERROR}" ]]; then
86 _pr_str
"${__ERROR}" yes
99 EVAL
"${r}" "${REPL_ENV}"
103 plus
() { r
=$
(( ${ANON["${1}"]} + ${ANON["${2}"]} )); _number "${r}"; }
104 minus
() { r
=$
(( ${ANON["${1}"]} - ${ANON["${2}"]} )); _number "${r}"; }
105 multiply
() { r
=$
(( ${ANON["${1}"]} * ${ANON["${2}"]} )); _number "${r}"; }
106 divide
() { r
=$
(( ${ANON["${1}"]} / ${ANON["${2}"]} )); _number "${r}"; }
108 _symbol
"+"; ENV_SET
"${REPL_ENV}" "${r}" plus
109 _symbol
"-"; ENV_SET
"${REPL_ENV}" "${r}" minus
110 _symbol
"__STAR__"; ENV_SET
"${REPL_ENV}" "${r}" multiply
111 _symbol
"/"; ENV_SET
"${REPL_ENV}" "${r}" divide
115 READLINE
"user> " ||
exit "$?"
116 [[ "${r}" ]] && REP "${r}" && echo "${r}"