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: Tue, 11 Mar 2014 01:03:10 +0100 Message-ID: <8738ipd2kh.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> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Trace: ger.gmane.org 1394496227 18806 80.91.229.3 (11 Mar 2014 00:03:47 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Tue, 11 Mar 2014 00:03: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 Tue Mar 11 01:03:52 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 1WNAAi-0002TE-8L for geh-help-gnu-emacs@m.gmane.org; Tue, 11 Mar 2014 01:03:52 +0100 Original-Received: from localhost ([::1]:51736 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WNAAh-0003Zk-My for geh-help-gnu-emacs@m.gmane.org; Mon, 10 Mar 2014 20:03:51 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:36928) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WNAAQ-0003VX-9U for help-gnu-emacs@gnu.org; Mon, 10 Mar 2014 20:03:40 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WNAAK-0004H8-1b for help-gnu-emacs@gnu.org; Mon, 10 Mar 2014 20:03:34 -0400 Original-Received: from plane.gmane.org ([80.91.229.3]:58759) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WNAAJ-0004Ez-Qs for help-gnu-emacs@gnu.org; Mon, 10 Mar 2014 20:03:27 -0400 Original-Received: from list by plane.gmane.org with local (Exim 4.69) (envelope-from ) id 1WNAAI-00021T-7h for help-gnu-emacs@gnu.org; Tue, 11 Mar 2014 01:03:26 +0100 Original-Received: from ip-90-186-176-150.web.vodafone.de ([90.186.176.150]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Tue, 11 Mar 2014 01:03:26 +0100 Original-Received: from michael_heerdegen by ip-90-186-176-150.web.vodafone.de with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Tue, 11 Mar 2014 01:03:26 +0100 X-Injected-Via-Gmane: http://gmane.org/ Original-Lines: 74 Original-X-Complaints-To: usenet@ger.gmane.org X-Gmane-NNTP-Posting-Host: ip-90-186-176-150.web.vodafone.de User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3.50 (gnu/linux) Cancel-Lock: sha1:rdBfwwdDi9OPImOHL66oKtakM3c= 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:96418 Archived-At: lee writes: > > (advice-add > > 'hi-lock-write-interactive-patterns :around > > ;; also include `hi-lock-file-patterns' > > (lambda (f &rest args) > What does (f &rest args) do or mean? >From the doc of `add-function', this is how :around advices FUNCTION are called: (lambda (&rest r) (apply FUNCTION OLDFUN r)) 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. 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. In my example, FUNCTION is (lambda (f &rest args) ...), which means that f will be bound to OLDFUN, i.e. the original definition of `hi-lock-write-interactive-patterns', and args will be bound to r, which will be the list of arguments with which `hi-lock-write-interactive-patterns' gets called. > > (apply f args))) > > f args? > > hi-lock-write-interactive-patterns doesn´t have any arguments. So, the function will always be called without arguments, which means that args will be bound to the empty list - no problem. So why did I write it that way? Because it works with any argument list. Instead of specifying the original argument list in the advice, I just use &rest args and apply the original function to args when I don't need to know the value of any argument. Of course you can also write (advice-add 'hi-lock-write-interactive-patterns :around (lambda (f) (let ((hi-lock-interactive-patterns (append hi-lock-interactive-patterns hi-lock-file-patterns)))) (funcall f))) But if some day `hi-lock-write-interactive-patterns' might become an optional argument, this advice would raise an wrong number of arguments error. > [1]: Another question: > > To get patterns from a separate file, I´m using find-file. This is > probably not very efficient: I suspect that the file is actually loaded > every time, with all what that implies. No, Emacs doesn't do such things. If the file is already found in a buffer, this buffer will just be selected when you `find-file' the same file again. If you want to try this approach, you can use `find-file-noselect', which returns the file's buffer (without selecting it) and assign it to some variable foo. Later, you can always just use (with-current-buffer foo ...). Regards, Michael.