emacs-bug-tracker
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debbugs-tracker] bug#14203: closed (Manual: 'my-or'; 'let' inside macro


From: GNU bug Tracking System
Subject: [debbugs-tracker] bug#14203: closed (Manual: 'my-or'; 'let' inside macros)
Date: Sun, 14 Apr 2013 17:59:02 +0000

Your message dated Sun, 14 Apr 2013 13:53:38 -0400
with message-id <address@hidden>
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
address@hidden)


-- 
14203: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=14203
GNU Bug Tracking System
Contact address@hidden with problems
--- Begin Message --- Subject: Manual: 'my-or'; 'let' inside macros Date: Sun, 14 Apr 2013 20:33:12 +0400
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

Attachment: pgprLvhRx7dJh.pgp
Description: PGP signature


--- End Message ---
--- Begin Message --- Subject: Re: bug#14203: Manual: 'my-or'; 'let' inside macros Date: Sun, 14 Apr 2013 13:53:38 -0400 User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux)
Nikita Karetnikov <address@hidden> 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


--- End Message ---

reply via email to

[Prev in Thread] Current Thread [Next in Thread]