GNU bug report logs -
#14203
Manual: 'my-or'; 'let' inside macros
Previous Next
Full log
View this message in rfc822 format
[Message part 1 (text/plain, inline)]
Your message dated Sun, 14 Apr 2013 13:53:38 -0400
with message-id <877gk53snx.fsf <at> tines.lan>
and subject line Re: bug#14203: Manual: 'my-or'; 'let' inside macros
has caused the debbugs.gnu.org bug report #14203,
regarding Manual: 'my-or'; 'let' inside macros
to be marked as done.
(If you believe you have received this mail in error, please contact
help-debbugs <at> gnu.org.)
--
14203: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=14203
GNU Bug Tracking System
Contact help-debbugs <at> gnu.org with problems
[Message part 2 (message/rfc822, inline)]
[Message part 3 (text/plain, inline)]
I think this example [1,2]:
(define-syntax my-or
(syntax-rules ()
((my-or)
#t)
((my-or exp)
exp)
((my-or exp rest ...)
(let ((t exp))
(if exp
exp
(my-or rest ...))))))
should look like this:
(define-syntax my-or
(syntax-rules ()
((my-or)
#t)
((my-or exp)
exp)
((my-or exp rest ...)
(let ((t exp))
(if t ; <-
t
(my-or rest ...))))))
Otherwise, what's the rationale behind 'let'?
AFAICT, it's described here [3], but Guile is not affected, right? So
the following works as well:
(define-syntax my-or
(syntax-rules ()
((my-or)
#t)
((my-or exp)
exp)
((my-or exp rest ...)
(if exp
exp
(my-or rest ...)))))
Note that 'my-or' is used in several places (e.g., [4]) and it's
necessary to change them all. Also, there are other macros that use
'let' (e.g., 'cond1').
[1] https://gnu.org/software/guile/manual/guile.html#Defining-Macros
[2] https://gnu.org/software/guile/manual/guile.html#Hygiene
[3] http://stackoverflow.com/a/3215238
[4] https://gnu.org/software/guile/manual/guile.html#Syntax-Case
[Message part 4 (application/pgp-signature, inline)]
[Message part 5 (message/rfc822, inline)]
Nikita Karetnikov <nikita <at> karetnikov.org> writes:
> I think this example [1,2]:
>
> (define-syntax my-or
> (syntax-rules ()
> ((my-or)
> #t)
> ((my-or exp)
> exp)
> ((my-or exp rest ...)
> (let ((t exp))
> (if exp
> exp
> (my-or rest ...))))))
>
> should look like this:
>
> (define-syntax my-or
> (syntax-rules ()
> ((my-or)
> #t)
> ((my-or exp)
> exp)
> ((my-or exp rest ...)
> (let ((t exp))
> (if t ; <-
> t
> (my-or rest ...))))))
Indeed, thanks! I've pushed this fix to the stable-2.0 branch, and am
closing this bug.
Answers to your other questions follow.
> AFAICT, it's described here [3], but Guile is not affected, right?
> [3] http://stackoverflow.com/a/3215238
That post gives an example that looks superficially similar, but is
actually entirely different:
(define remove!
(let ((null? null?)
(cdr cdr)
(eq? eq?))
(lambda ... function that uses null?, cdr, eq? ...)
Indeed, this is not necessary in Guile due to its module system.
> So the following works as well:
>
> (define-syntax my-or
> (syntax-rules ()
> ((my-or)
> #t)
> ((my-or exp)
> exp)
> ((my-or exp rest ...)
> (if exp
> exp
> (my-or rest ...)))))
The above definition has a problem: it would result in 'exp' being
evaluated more than once, unless it returns false.
For example, if you used your proposed definition above,
(my-or (read) 5) would expand to:
(if (read)
(read)
5)
Which would obviously not do what you expect from 'or'. Instead, we
want:
(let ((t (read)))
(if t
t
5))
> Note that 'my-or' is used in several places (e.g., [4]) and it's
> necessary to change them all.
> [4] https://gnu.org/software/guile/manual/guile.html#Syntax-Case
Unless I'm mistaken, the Syntax-case section uses 'my-or', but does not
define it, so I don't think anything needs to be fixed there. Right?
Thanks,
Mark
This bug report was last modified 12 years and 91 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.