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:22 UTC

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