Make the REPL read multi-line forms and render real error messages
The REPL evaluated one line at a time, so a form split across lines (e.g. `(+` then `1 2)`) raised instead of waiting. The read loop now accumulates lines until delimiters are balanced — skipping string, char, regex and comment context — printing a `... ` continuation prompt for each extra line. Reader/runtime errors rendered as Chez's "attempt to apply non-procedure #[chez-pmap...]" instead of their real message. Two causes: jolt-throw raised the thrown value raw. When a throw crossed the host `eval` boundary, Chez re-wrapped the non-condition into a compound condition whose message extraction applies the value, losing the message and crashing on ex-info's empty-map :data. jolt-throw now raises a &jolt-throw condition wrapping the value; catch (lowered to `guard`), jolt-report-uncaught and jolt-render-throwable unwrap it back via jolt-unwrap-throw, so ex-data/ex-message and the backtrace tag survive. Every reader/post-prelude EOF-throw site used `(empty-pmap)` (with parens), applying the empty-map value as a procedure and crashing during ex-info construction before jolt-throw ran. Fixed to `empty-pmap`. Re-minted the seed; smoke 23/23, unit 574/574.
This commit is contained in:
parent
a58bca3bee
commit
240458d994
10 changed files with 225 additions and 132 deletions
|
|
@ -44,6 +44,14 @@ check '(/ 1 2)' '1/2'
|
|||
check '(= 3 3.0)' 'false'
|
||||
check '(== 3 3.0)' 'true'
|
||||
check_loc '(throw (ex-info "boom" {}))' ' at 1:'
|
||||
|
||||
# A throw that crosses the eval boundary (eval / load-string) must surface its
|
||||
# ex-info :message, not Chez's "attempt to apply non-procedure" noise from
|
||||
# re-wrapping a raw value raised through `eval`.
|
||||
check '(try (eval (read-string "(throw (ex-info \"boom\" {}))")) (catch :default e (ex-message e)))' 'boom'
|
||||
check '(try (load-string "(+") (catch :default e (ex-message e)))' 'EOF while reading'
|
||||
# An uncaught throw prints the ex-info message alongside its source location.
|
||||
check_loc '(throw (ex-info "boom" {}))' 'boom'
|
||||
check_loc '(do (+ 1 1) (/ 1 0))' ' at 1:'
|
||||
|
||||
# --help prints usage, and lists the nREPL server under its real flag name.
|
||||
|
|
@ -88,5 +96,16 @@ else
|
|||
fails=$((fails + 1))
|
||||
fi
|
||||
|
||||
# A form split across lines is accumulated and evaluated once complete, with a
|
||||
# secondary continuation prompt before each continued line.
|
||||
repl_out="$(printf '(+ 1\n2)\n:exit\n' | bin/joltc repl 2>/dev/null)"
|
||||
if printf '%s' "$repl_out" | grep -q '3' && ! printf '%s' "$repl_out" | grep -q 'error'; then
|
||||
pass=$((pass + 1))
|
||||
else
|
||||
echo " FAIL: repl should accumulate multi-line forms to 3"
|
||||
printf '%s\n' "$repl_out" | sed 's/^/ | /'
|
||||
fails=$((fails + 1))
|
||||
fi
|
||||
|
||||
echo "cli smoke: $pass passed, $fails failed"
|
||||
[ "$fails" -eq 0 ]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue