"Its not clear what you were asking for in saying simple-error should be able to accept exceptions"
Exception objects. What X is bound to in (trap-error ... (/. X X))
"Or is the argument that there is some information in an exception that cannot be rendered into text and is in some sense ineffable?"
Yeah the exception object in Chez Scheme contains the continuation closure, and potentially other objects, which can't be recovered from a string representation.
Even if you could convert them to string, you would still have issues with error-to-string having a lousy API. If error-to-string encodes the fancy exception object in some platform specific way into a string, then exception messages can't be printed properly, because they would have to be parsed from a format that differs depending on the backend, and it raises the question of why even bother having an error-to-string function if it can't be used to pretty print just the exception message without serialised debug info. It would make it impossible to compare strings for certain specific exceptions as well, because the string encoded by error-to-string would be dependent on the execution history. Also every call to error-to-string would append unwanted data to the exception string at every propagation point which re-throws the same exception.
While it's true that you can't force people to update their ports, you do control whatever is considered the current specification of Shen. My proposed change is extremely simple and doesn't break pre-existing code because it just extends the valid input domain of the simple-error function. It was 1-2 lines of code changes in the Scheme port, simply adding a conditional branch:
(define (throw-exception sys who msg)
(raise (if (string? msg)
(make-shen-exception-condition who msg sys)
msg)))
To be more concrete, consider below this arbitrary exception that happens to be sitting in my REPL at the moment. The stack trace is extracted from the continuation data in the exception object. Every $guard frame is a Shen trap-error point btw.
0: #<continuation in kl:_7#_rt_pl_eval_apply.prolog.apply>
1: #<continuation in kl:_8#typecheck.toplevel-check>
2: #<continuation in kl:_8#rewrite-system.dispatch>
3: #<continuation>
4: #<system continuation>
5: #<system continuation in dynamic-wind>
6: #<system continuation in $guard>
7: #<continuation in kl:_8#rewrite-system.step>
8: #<continuation>
9: #<system continuation>
10: #<system continuation in dynamic-wind>
11: #<system continuation in $guard>
12: #<continuation>
13: #<system continuation>
14: #<system continuation in dynamic-wind>
15: #<system continuation in $guard>
16: #<continuation in kl:_8#load.toplevel>
17: #<continuation>
18: #<continuation in kl:_8#repl.branch>
19: #<continuation>
20: #<continuation>
21: #<system continuation>
22: #<system continuation in dynamic-wind>
23: #<system continuation in $guard>
24: #<continuation>
25: #<system continuation>
26: #<system continuation in dynamic-wind>
27: #<system continuation in $guard>
28: #<continuation>
29: #<system continuation>
30: #<system continuation in dynamic-wind>
31: #<system continuation in $guard>
32: #<continuation>
33: #<system continuation>
34: #<system continuation in dynamic-wind>
35: #<system continuation in $guard>
36: #<continuation in kl:_8#repl.enter>
37: #<system continuation in new-cafe>