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
prev parent 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.