Advice (programming)


In aspect and functional programming, advice describes a class of functions which modify other functions when the latter are run; it is a certain function, method or procedure that is to be applied at a given join point of a program.
The following is taken from a discussion at the mailing list . Pascal Costanza contributed the following:
The term advice goes back to the term advising as introduced by Warren Teitelman in his PhD thesis in 1966. Here is a quote from Chapter 3 of his thesis:
"Advising" found its way into BBN Lisp and later into Xerox PARC's Interlisp.
It also found its way to Flavors, the first object-oriented extension to Lisp developed at MIT. They were subsumed under the notion of method combination.
Since method combination and macros are closely related, it's also interesting to note that the first macro system was described in 1963, three years before Warren Teitelman's PhD thesis.

Use

The practical use of advice functions is generally to modify or otherwise extend the behavior of functions which cannot be easily modified or extended. The Emacspeak Emacs-addon makes extensive use of advice: it must modify thousands of existing Emacs modules and functions such that it can produce audio output for the blind corresponding to the visual presentation, but it would be infeasible to copy all of them and redefine them to produce audio output in addition to their normal outputs; so, the Emacspeak programmers define advice functions which run before and after.
Another Emacs example; suppose after one corrected a misspelled word through ispell, one wanted to re-spellcheck the entire buffer. ispell-word offers no such functionality, even if the spellchecked word is used a thousand times. One could track down the definition of ispell-word, copy it into one's Emac, and write the additional functionality, but this is tedious, prone to broken-ness. What one wants is fairly simple: just to run another command after ispell-word runs. Using advice functions, it can be done as simply as this:


)

Implementations

A form of advices were part of C with Classes in the late 1970s and early 1980s, namely functions called call and return defined in a class, which were called before member functions of the class. However, these were dropped from C++.
Advices are part of the Common Lisp Object System, as :before, :after, and :around methods, which are combined with the primary method under "standard method combination".
Common Lisp implementations provide advice functionality as extensions. LispWorks supports advising functions, macros and CLOS methods.
EmacsLisp added advice-related code in version , 1994.