all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Kevin Rodgers <kevin.d.rodgers@gmail.com>
To: help-gnu-emacs@gnu.org
Subject: Re: around advice: why does (and ad-do-it nil) return t?
Date: Mon, 13 Feb 2012 21:18:59 -0700	[thread overview]
Message-ID: <jhcn98$9dp$1@dough.gmane.org> (raw)
In-Reply-To: <81zkcm6g2x.fsf@gmail.com>

On 2/13/12 6:03 AM, Jambunathan K wrote:
> Leo Alekseyev<dnquark@gmail.com>  writes:
>
>> Consider the following code:
>>
>> (defun foobar () t)
>> (defadvice foobar (around foobar-advice activate)
>>    (and ad-do-it nil))
>>
>> Evaluating the advised foobar seems to return t.  Why?  Naively, one
>> expects (and [whatever] nil) to evaluate to nil!
>
> One possible reason could be this:
>
> (info "(elisp) Around-Advice")
> ,----
> |  -- Variable: ad-do-it
> |      This is not really a variable, rather a place-holder that looks
> |      like a variable.  You use it in around-advice to specify the place
> |      to run the function's original definition and other "earlier"
> |      around-advice.
> `----
>
> May be you are looking for ad-return-value.
>
> (info "(elisp) Defining Advice")
> ,----
> |  -- Variable: ad-return-value
> |      While advice is executing, after the function's original
> |      definition has been executed, this variable holds its return
> |      value, which will ultimately be returned to the caller after
> |      finishing all the advice.  After-advice and around-advice can
> |      arrange to return some other value by storing it in this variable.
> `----

Exactly.  The advised function always returns ad-return-value (which the
various pieces of advice may alter).  As explained in the "Combined Definition"
node of the Elisp manual:

----------------------------------------------------------------------
Suppose that a function has N pieces of before-advice (numbered from 0
through N-1), M pieces of around-advice and K pieces of after-advice.
Assuming no piece of advice is protected, the combined definition
produced to implement the advice for a function looks like this:

      (lambda ARGLIST
        [ [ADVISED-DOCSTRING] [(interactive ...)] ]
        (let (ad-return-value)
          before-0-body-form...
               ....
          before-N-1-body-form...
          around-0-body-form...
             around-1-body-form...
                   ....
                around-M-1-body-form...
                   (setq ad-return-value
                         apply original definition to ARGLIST)
                end-of-around-M-1-body-form...
                   ....
             end-of-around-1-body-form...
          end-of-around-0-body-form...
          after-0-body-form...
                ....
          after-K-1-body-form...
          ad-return-value))
----------------------------------------------------------------------

Basically, ad-do-it expands to

                   (setq ad-return-value
                         apply original definition to ARGLIST)

-- 
Kevin Rodgers
Denver, Colorado, USA




      reply	other threads:[~2012-02-14  4:18 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-02-13 12:43 around advice: why does (and ad-do-it nil) return t? Leo Alekseyev
2012-02-13 13:03 ` Jambunathan K
2012-02-14  4:18   ` Kevin Rodgers [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='jhcn98$9dp$1@dough.gmane.org' \
    --to=kevin.d.rodgers@gmail.com \
    --cc=help-gnu-emacs@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.