Some initial comments Daphne Preston-Kendal (04 Apr 2026 10:01 UTC)
Re: Some initial comments Andrew Tropin (07 Apr 2026 11:29 UTC)
Re: Some initial comments Daphne Preston-Kendal (29 Jul 2026 20:17 UTC)
Re: Some initial comments Vincent Manis (he/him) (29 Jul 2026 21:03 UTC)
Re: Some initial comments Wolfgang Corcoran-Mathe (01 Aug 2026 16:16 UTC)
Re: Some initial comments Andrew Tropin (13 Aug 2026 06:12 UTC)
Re: Some initial comments Andrew Tropin (13 Aug 2026 06:03 UTC)
Re: Some initial comments Daphne Preston-Kendal (19 Aug 2026 06:49 UTC)
Re: Some initial comments Andrew Tropin (02 Sep 2026 12:17 UTC)
Re: Some initial comments Daphne Preston-Kendal (07 Sep 2026 08:18 UTC)
Re: Some initial comments Andrew Tropin (09 Sep 2026 11:04 UTC)

Re: Some initial comments Andrew Tropin 09 Sep 2026 11:04 UTC
On 2026-09-07 10:18, Daphne Preston-Kendal wrote:

> On 2 Sep 2026, at 14:16, Andrew Tropin <xxxxxx@trop.in> wrote:
>
>>> But this doesn’t answer the problem that the recommendation which seems to justify the existence of ‘set-current-test-runner!’ is ill advised. To clarify: if I import multiple libraries that provide test runners (because, for example, I want to make it a run time option to my test suite which is used), and each of them calls set-current-test-runner! to establish its own runner as the default, then under Scheme’s semantics it is unspecified which of those calls to set-current-test-runner! will run last and thus ‘win’, or indeed whether any of the calls at all will run.
>>
>> It's very unlikely case that multiple testing libraries will be loaded
>> at the same time and if so, it's a responsibility of the user to set a
>> proper default test runner.  I believe they will figure out how to setup
>> their REPL environment for this case.
>
> Sorry, I think I wasn’t clear enough about what the problem is here and only confused the issue by mentioning importing multiple test runners.
>
> If a program (in the sense of the R6RS or R7RS small) to run a test suite looks like this:
>
> (import (srfi :269)
>         (rot13)
>         (spiffing-test-runner))
> (test "example library test" ()
>   (is (string=? (string-rot13 "er") "re")))
>
> And the (spiffing-test-runner) library looks like this:
>
> (library (spiffing-test-runner)
>   (export run-tests-spiffingly)
>   (import (srfi :269)
>           (rnrs)
>           #;etc)
>   (define (run-tests-spiffingly arg)
>     #| code defines the test runner |#)
>   (set-default-test-runner! run-tests-spiffingly))
>
> Then it is unspecified whether the test will run with the run-tests-spiffingly procedure or with no test runner at all (unexpectedly triggering the ‘should produce a diagnostic indicating that no runner has been configured’). Because it is not lexically apparent to the compiler that the program actually depends on any identifiers from the (spiffing-test-runner) library, because none of its exported identifiers, the compiler may decide never to instantiate the library and thus may never run the set-default-test-runner! call. This is what I mean about the ‘may call set-default-test-runner! upon loading so that end users need not configure it manually’ recommendation being ill advised.
>
> (Note that not all Scheme implementations have REPLs. A SRFI intended to be generally useful to Schemers of all stripes should be designed with a static ahead-of-time compiler in mind, as well as a highly interactive implementation like Guile.)

There is no need to call set-default-test-runner! if the scheme
implementation doesn't support REPL or have hard to predict module
loading behavior.  SRFI just gives a tip that library may do so to
provide some convinince, but it doesn't have to.

As for your example, top-level undelayed test definitions are not
recommended.  It's better to always use define-suite or do
(define name
 (suite-loader ...))

to make sure the forms are not evaluated and no messages are sent to
test runner on module loading.

The overall workflow looks like this:

(with-current-test-runner spiffing-test-runner
  (load-necessary-modules)
  (define suite-loaders (collect-suite-definitions-from-necessary-modules))
  (for-each (lambda (sl) (sl)) suite-loaders)
  ((current-test-runner) `((type . runner/run-tests))))

Of course, it can be (and should be) automated and/or integrated into
IDE/REPL.

>
>> This implemementation looks uglier, but seems to work.
>
> This implementation will fail on static ahead-of-time compilers if
> there *aren’t* local bindings called ‘quote’ and ‘metadata’, because
> it will still insert a free reference to identifiers with those names
> into the expansion. It will be in dead code, but it will still be
> there.
>
> Again, please just use a regular auxiliary syntax keyword and forget
> the ‘quote’. You can’t do what you’re trying to do in syntax-rules,
> because this is not how the syntax of Scheme is intended to work.

I tried to implement (metedata `((my . meta))) syntax and it doesn't
look any better internally.  It suffer from the same syntax-rules
limitations and probably will have the same problems with AOT.

Could you draft a basic skeleton of the macro which recognizes metadata
and non-metadata cases, please?

Also, I would really appreciate if you could provide a sample,
demonstrating a mentioned problem (and corresponding Scheme/environment
info), so I can run it locally and ensure the final implementation won't
suffer from it.

--
Best regards,
Andrew Tropin