Re: New draft (#8) of and new "last call" for SRFI 189: Maybe and Either: optional container types Marc Nieper-Wißkirchen (11 Jul 2020 15:30 UTC)

Re: New draft (#8) of and new "last call" for SRFI 189: Maybe and Either: optional container types Marc Nieper-Wißkirchen 11 Jul 2020 15:30 UTC

Am Sa., 11. Juli 2020 um 17:22 Uhr schrieb Wolfgang Corcoran-Mathe
<xxxxxx@sigwinch.xyz>:
>
> On 2020-07-10 16:39 +0200, Marc Nieper-Wißkirchen wrote:
> > The following tests pass:
> >
> > [snip]
> >
> >   (check (either= eqv? (with-exception-handler
> >                            (lambda (x)
> >                              (+ 1 x))
> >                         (lambda ()
> >                            (either-guard string? (+ 2 (raise-continuable 39)))))
> >                  (right 42))
> >      => #t))
>
> Thanks very much for the implementation and the tests.
>
> This final test causes an "exception handler returned" error on Chibi
> when either->exception / either-guard is implemented with guard.  If
> I'm reading R7 right, this is to be expected, as guard always invokes
> raise if none of its clauses succeed.  Thus, the continuation is lost.

Chibi is wrong here. The history is as follows:

1) In the R6RS document, when no clause is fulfilled a non-continuable
exception is raised.
2) As this was a mistake, it was corrected in an erratum to R6RS so
that a continuable exception is raised.
3) In the R7RS document, the correct version of R6RS is used.
4) Someone came along and saw that the R7RS version differed from the
(original) R6RS version, so an erratum was issued for R7RS (people had
forgotten about 2)).
5) I filed a bug report with Chibi, which since then implements the
miscorrected version of R7RS.
6) Someone saw that the original R7RS version was the intended version
of R6RS and so the erratum of 4) was taken back.

So we are still missing:

7) Chibi reverts
https://github.com/ashinn/chibi-scheme/commit/28148e52b7f178cc4336b775bdc14dd6adbc0330.

Do this in your local copy of Chibi and the test should pass. (I've
put Alex in CC.)

Marc