Edge case in SRFI-139 Jakub T. Jankiewicz (28 Jan 2024 11:46 UTC)
Re: Edge case in SRFI-139 Marc Nieper-Wißkirchen (28 Jan 2024 12:31 UTC)
Re: Edge case in SRFI-139 Jakub T. Jankiewicz (28 Jan 2024 14:09 UTC)
Re: Edge case in SRFI-139 Marc Nieper-Wißkirchen (28 Jan 2024 14:43 UTC)
Re: Edge case in SRFI-139 Jakub T. Jankiewicz (28 Jan 2024 16:12 UTC)
Re: Edge case in SRFI-139 Marc Nieper-Wißkirchen (28 Jan 2024 16:20 UTC)
Re: Edge case in SRFI-139 Jakub T. Jankiewicz (28 Jan 2024 16:22 UTC)
Re: Edge case in SRFI-139 Marc Nieper-Wißkirchen (28 Jan 2024 16:28 UTC)
Re: Edge case in SRFI-139 Jakub T. Jankiewicz (28 Jan 2024 17:56 UTC)
Re: Edge case in SRFI-139 Jakub T. Jankiewicz (28 Jan 2024 16:39 UTC)
Re: Edge case in SRFI-139 Shawn Wagner (28 Jan 2024 16:57 UTC)

Re: Edge case in SRFI-139 Jakub T. Jankiewicz 28 Jan 2024 16:39 UTC

Sorry I was wrong, this do work in Chibi and Guile:

(define-syntax-parameter it (syntax-rules ()))

(define-syntax foo
  (syntax-rules ()
    ((_ body ...)
     (begin
       (syntax-parameterize
        ((it (syntax-rules ()
               ((_) "hello world"))))
        (print (it))
        body ...)))))

(foo (print (it)))

(let ((it 10))
  (foo (print it)))

and prints "hello world", "hello world", "hello world", and 10

But Chibi require to import (srfi 139) otherwise define-syntax-parameter is
not defined.

On Sun, 28 Jan 2024 17:22:33 +0100
"Jakub T. Jankiewicz" <xxxxxx@onet.pl> wrote:

> To be clear. This works fine:
>
> (define-syntax-parameter it (syntax-rules ()))
>
> (define-syntax foo
>   (syntax-rules ()
>     ((_ body ...)
>      (begin
>        (syntax-parameterize
>         ((it (syntax-rules ()
>                ((_) "hello world"))))
>         body ...)))))
>
> (foo (print it))
>
> For Chibi and Guile define-syntax-parameter is not needed it works the same.
>
> But what should be the output of this:
>
> (let ((it 10))
>   (foo (print it)))
>
> It's not clear what should happen. Should it print 10, #<syntax-rules>
> object it throw an error.
>
> On Sun, 28 Jan 2024 17:12:11 +0100
> "Jakub T. Jankiewicz" <xxxxxx@onet.pl> wrote:
>
> > OK, this is correct, I understand. But what should be output? What both
> > print statements should print? But implementations Guile and Chibi throws
> > an error.
> >
> > On Sun, 28 Jan 2024 15:43:08 +0100
> > Marc Nieper-Wißkirchen <xxxxxx@gmail.com> wrote:
> >
> > > Am So., 28. Jan. 2024 um 15:09 Uhr schrieb Jakub T. Jankiewicz <
> > > xxxxxx@onet.pl>:
> > >
> > > > Only Racket give an error when there are no define-syntax-parameter,
> > > > the other implementations mention in SRFI (Guile and Chibi) doesn't
> > > > require it to work. So I just leave it out. The code works the same
> > > > if there define-syntax-parameter.
> > > >
> > >
> > > If an implementation allows arbitrary keywords to be
> > > syntax-parameterized, referential transparency of macros is violated.
> > > E.g., some macro, say `when` may expand into code involving `if` and
> > > would break if `if` were syntax-parameterized.
> > >
> > > So what should be the output of there is define-syntax-parameter?
> > > >
> > >
> > > The following would be correct:
> > >
> > > (define (print x . rest)
> > >   (apply display x rest)
> > >   (newline))
> > >
> > > (define-syntax foo
> > >   (syntax-rules ()
> > >     ((_ body ...)
> > >      (begin
> > >        (define-syntax-parameter it (syntax-rules ()))
> > >        (syntax-parameterize
> > >         ((it (syntax-rules ()
> > >                ((_) "hello world"))))
> > >         (print it)
> > >         body ...)))))
> > >
> > > (let ((it 10))
> > >   (foo (print it)))
> > >
> > > The final expression would first expand into
> > >
> > > (let ((it 10))
> > >   (begin
> > >     (define-syntax-parameter it* (syntax-rules ()))
> > >     (syntax-parameterize
> > >         ((it* (syntax-rules () ((_) "hello world"))))
> > >       (print it*)
> > >       (print it)))
> > >
> > > where `it*` stands for the renamed `it`.  The expression `it*` in the
> > > line `(print it*)` is now a syntax error because `it*` is not valid
> > > syntax for the syntax-rules syntax transformer associated with `it*`
> > > (syntax-rules do not allow identifier syntax).  In other words, you get
> > > again undefined behaviour in R7RS.
> > >
> > > PS Unless you have specific reasons to stick to R7RS, you will probably
> > > be more helped by switching to R6RS, which doesn't have all this
> > > undefined behaviour that is in R7RS and where experimenting with
> > > specific implementations doesn't tell you much about the semantics.
> > >
> > >
> > >
> > >
> > > >
> > > > On Sun, 28 Jan 2024 13:31:27 +0100
> > > > Marc Nieper-Wißkirchen <xxxxxx@gmail.com> wrote:
> > > >
> > > > > Your code is an error, so any behaviour is allowed (according to the
> > > > > R7RS).  The problem with your code is that `syntax-parameterize` can
> > > > > only be applied to identifiers that are bound by
> > > > > `define-syntax-parameter`.
> > > > In
> > > > > your code, the identifier `it` in the macro body (which becomes
> > > > > hygienically renamed to, say, `it*`) is unbound.
> > > > >
> > > > >
> > > > > Am So., 28. Jan. 2024 um 12:46 Uhr schrieb Jakub T. Jankiewicz -
> > > > > jcubic
> > > > at
> > > > > onet.pl (via srfi-discuss list) <xxxxxx@srfi.schemers.org>:
> > > > >
> > > > > > Hi,
> > > > > >
> > > > > > What should be the output of this code:
> > > > > >
> > > > > > (define (print x . rest)
> > > > > >   (apply display x rest)
> > > > > >   (newline))
> > > > > >
> > > > > > (define-syntax foo
> > > > > >   (syntax-rules ()
> > > > > >     ((_ body ...)
> > > > > >      (begin
> > > > > >        (syntax-parameterize
> > > > > >         ((it (syntax-rules ()
> > > > > >                ((_) "hello world"))))
> > > > > >         (print it)
> > > > > >         body ...)))))
> > > > > >
> > > > > > (let ((it 10))
> > > > > >   (foo (print it)))
> > > > > >
> > > > > >
> > > > > > I only tested in two implementations Chibi and Guile.
> > > > > > Guile give an error but Chibi first print 10.
> > > > > >
> > > > > > My implementation prints 10 10.
> > > > > >
> > > > > > Jakub
> > > > > >
> > > > > > --
> > > > > > Jakub T. Jankiewicz, Senior Front-End Developer
> > > > > > https://jcubic.pl/me
> > > > > > https://lips.js.org
> > > > > > https://koduj.org
> > > > > >
> > > >
> > > > --
> > > > Jakub T. Jankiewicz, Senior Front-End Developer
> > > > https://jcubic.pl/me
> > > > https://lips.js.org
> > > > https://koduj.org
> > > >
> >
>

--
Jakub T. Jankiewicz, Senior Front-End Developer
https://jcubic.pl/me
https://lips.js.org
https://koduj.org