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)
|
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