From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: lee Newsgroups: gmane.emacs.help Subject: Re: replacing a function with another one Date: Wed, 12 Mar 2014 15:04:56 +0100 Organization: my virtual residence Message-ID: <87zjkvms1j.fsf@yun.yagibdah.de> References: <87vbvofsi6.fsf@yun.yagibdah.de> <87bnxgs4r9.fsf@web.de> <87lhwj1cfz.fsf@yun.yagibdah.de> <87zjkz6vd5.fsf@web.de> <8738ir161u.fsf@yun.yagibdah.de> <87eh2b6nfm.fsf@web.de> <87r46anab5.fsf@yun.yagibdah.de> <87wqg2u77k.fsf@web.de> <87pplugjh6.fsf@yun.yagibdah.de> <8738ipd2kh.fsf@web.de> <87y50gj1uf.fsf@yun.yagibdah.de> <874n34ticd.fsf@web.de> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Trace: ger.gmane.org 1394646227 15564 80.91.229.3 (12 Mar 2014 17:43:47 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Wed, 12 Mar 2014 17:43:47 +0000 (UTC) To: help-gnu-emacs@gnu.org Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Wed Mar 12 18:43:56 2014 Return-path: Envelope-to: geh-help-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1WNnC7-0002u6-MQ for geh-help-gnu-emacs@m.gmane.org; Wed, 12 Mar 2014 18:43:55 +0100 Original-Received: from localhost ([::1]:33836 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WNnC7-00075d-A0 for geh-help-gnu-emacs@m.gmane.org; Wed, 12 Mar 2014 13:43:55 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:41472) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WNnB4-0005nj-TQ for help-gnu-emacs@gnu.org; Wed, 12 Mar 2014 13:42:55 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WNnAz-0004f6-Lp for help-gnu-emacs@gnu.org; Wed, 12 Mar 2014 13:42:50 -0400 Original-Received: from client-194-42-186-216.muenet.net ([194.42.186.216]:52975 helo=yun.yagibdah.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WNnAz-0004dx-5E for help-gnu-emacs@gnu.org; Wed, 12 Mar 2014 13:42:45 -0400 Original-Received: from lee by yun.yagibdah.de with local (Exim 4.80.1) (envelope-from ) id 1WNnAs-000607-K8 for help-gnu-emacs@gnu.org; Wed, 12 Mar 2014 18:42:38 +0100 In-Reply-To: <874n34ticd.fsf@web.de> (Michael Heerdegen's message of "Wed, 12 Mar 2014 00:40:18 +0100") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3.50 (gnu/linux) Mail-Followup-To: help-gnu-emacs@gnu.org X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 194.42.186.216 X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Users list for the GNU Emacs text editor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Original-Sender: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.help:96466 Archived-At: Michael Heerdegen writes: > lee writes: > >> > Note that the advice FUNCTION will be called with an additional (the >> > first) argument, which will be bound to the original function when the >> > advice is called. >> >> The documentation doesn=C2=B4t say that. > > It does say it: > > `:around' (lambda (&rest r) (apply FUNCTION OLDFUN r)) > ^^^^^^ >> > This way, you have direct access to the original function through that >> > binding in your advice, and you can call it with funcall or apply. >> > This "mechanism" is the replacement for the old ad-do-it. >> >> Why doesn=C2=B4t the documentation just say that? > > Because it's trivial. It is complicated and cryptic. That line doesn=C2=B4t tell me anything, it only confuses me. Why and how would I apply and old function with an anonymous function that appears to be a named one? And r is still undefined. >> How does that go along with the documentation? The documentation says >> "(lambda (&rest r) (apply FUNCTION OLDFUN r))", whatever that means. >> You have (f) instead of (&rest r), and "(apply FUNCTION OLDFUN r)" is >> missing. > > I think I understand now what you are missing. > > (lambda (&rest r) (apply FUNCTION OLDFUN r)) > > is _not_ a template of how you would write your advice. In this line, > FUNCTION means your piece of advice, the function you specify as advice. > The above line describes the semantic of the advised function, i.e., how > the advice will be constructed that will combine the original function > with your advice. Why can=C2=B4t I just specify that my own function should be called instead of the existing one and then that I can call the original function from within my function? After all, that is what this kind of advice is supposed to be for. Something like: (defun replacement-fn (original-fn-arg0 original-fn-arg1) (foobar) (original-fn original-fn-arg0 original-fn-arg1) (barfoo)) (callinstead original-fn replacement-fn) That would be clear and simple, assuming that calling the original function from within a function that is defined to be called instead of it always automatically calls the original function. Otherwise, use something like (calloriginal (original-fn original-fn-arg0 original-fn-arg1)) --- that=C2=B4s probably clearer anyway. You could also have `callbefore', `callafter', etc. Maybe it=C2=B4s even possible to implement this, using add-advice. Perhaps for some things you=C2=B4d still have to fall back to using add-advice directly. For 99% of the cases, it would be great. You might take it a step further and provide something to check whether the original-fn has changed, like a hash of the version the callinstead was written for. Put the hash into the code like (callinstead-hash original-fn "") and when your code is loaded or before it=C2=B4s evaluated, the hash is verified and you get a warning when the original-fn has changed. Add a flag or something that optionally makes using a hash mandatory. >> What if you want to use one of the arguments? > > Use an according argument list in FUNCTION, and refer to the arguments in > the function body. Like how? >> What when you use find-file-noselect and the file cannot be visited? >> The documentation only says it returns the buffer, not what it returns >> when it fails. > > It will raise an error when the file doesn't exist or can't be read, so > you must check that yourself if you need to - see `file-exists-p', > `file-readable-p'. ok --=20 Knowledge is volatile and fluid. Software is power.