#!/usr/bin/env bash source $[dirname $0]/reader.sh source $[dirname $0]/printer.sh # read proc READ { test $(1) && setglobal r = $(1) || READLINE READ_STR $(r) } # eval proc EVAL { local ast="$(1)" local env="$(2)" setglobal r = '' [[ "${__ERROR}" ]] && return 1 setglobal r = $(ast) } # print proc PRINT { if [[ "${__ERROR}" ]] { _pr_str $(__ERROR) yes setglobal r = ""Error: $(r)"" setglobal __ERROR = '' } else { _pr_str $(1) yes } } # repl proc REP { READ $(1) EVAL $(r) PRINT $(r) } # repl loop while true { READLINE "user> " || exit "$?" [[ "${r}" ]] && REP $(r) && echo $(r) }