From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Michael Heerdegen Newsgroups: gmane.emacs.help Subject: Re: replacing a function with another one Date: Wed, 12 Mar 2014 07:11:17 +0100 Message-ID: <87bnxcrloa.fsf@web.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 X-Trace: ger.gmane.org 1394604714 24169 80.91.229.3 (12 Mar 2014 06:11:54 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Wed, 12 Mar 2014 06:11:54 +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 07:12:02 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 1WNcOY-0008Rw-4L for geh-help-gnu-emacs@m.gmane.org; Wed, 12 Mar 2014 07:12:02 +0100 Original-Received: from localhost ([::1]:58773 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WNcOX-0000MD-JR for geh-help-gnu-emacs@m.gmane.org; Wed, 12 Mar 2014 02:12:01 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:41418) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WNcOE-0000L6-VR for help-gnu-emacs@gnu.org; Wed, 12 Mar 2014 02:11:50 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WNcO7-0002jE-KE for help-gnu-emacs@gnu.org; Wed, 12 Mar 2014 02:11:42 -0400 Original-Received: from plane.gmane.org ([80.91.229.3]:59966) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WNcO7-0002iR-Cm for help-gnu-emacs@gnu.org; Wed, 12 Mar 2014 02:11:35 -0400 Original-Received: from list by plane.gmane.org with local (Exim 4.69) (envelope-from ) id 1WNcO5-00086V-OJ for help-gnu-emacs@gnu.org; Wed, 12 Mar 2014 07:11:33 +0100 Original-Received: from ip-90-187-149-152.web.vodafone.de ([90.187.149.152]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Wed, 12 Mar 2014 07:11:33 +0100 Original-Received: from michael_heerdegen by ip-90-187-149-152.web.vodafone.de with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Wed, 12 Mar 2014 07:11:33 +0100 X-Injected-Via-Gmane: http://gmane.org/ Original-Lines: 68 Original-X-Complaints-To: usenet@ger.gmane.org X-Gmane-NNTP-Posting-Host: ip-90-187-149-152.web.vodafone.de User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3.50 (gnu/linux) Cancel-Lock: sha1:50YQS5K7+udQqsAPQ9jA9UlyO3o= X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 80.91.229.3 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:96448 Archived-At: Michael Heerdegen writes: > Because it's trivial. I have the feeling that this might sound strange - but it's true! So, here is some pseudo code that shows, in a simplified manner, what defining an around advice with `advice-add' does: (defun my-add-around-advice (fun-to-advice advice) (lexical-let ((oldfun (symbol-function fun-to-advice)) (function advice)) (fset fun-to-advice (lambda (&rest r) (apply function oldfun r))))) FUN-TO-ADVICE is the function to advice, ADVICE is the piece of advice you want to add. Do you recognize the line I cite all the time? It's what you get as resulting combined function. Actually, it's not pseudo code but fully functional. An example. Let's define the faculty (a non-recursive version): (defun my-fac (n) (reduce '* (number-sequence 1 n))) Suppose we want to make it return the faculty of -n for negative integers n by adding an around advice (currently it returns 1 for negative arguments). With the above simple implementation, you would do it like that: (my-add-around-advice 'my-fac (lambda (orig-fun n) (funcall orig-fun (abs n)))) Then, e.g. (my-fac -5) ==> 120 Of course, you can't remove the advice with my simplified version, etc. With `advice-add' you would do (advice-add 'my-fac :around (lambda (orig-fun n) (funcall orig-fun (abs n)))) Let's add another around advice that makes `my-fac' print the result in the echo area. This time using a named function as advice: (defun my-fac--print-result-around-advice (orig-fun n) "Print result in the echo area." (let ((result (funcall orig-fun n))) (message "The faculty of %d is %d" n result) (sit-for 3) result)) (my-add-around-advice 'my-fac #'my-fac--print-result-around-advice) These are not very useful examples, but hopefully they show a bit how it works, and one can play with them. You also see how to deal with arguments and the return value of the original function. The other advice types can be implemented similarly. Regards, Michael.