* Redefining functions and variables
@ 2010-07-27 15:12 Elena
2010-07-27 20:21 ` Stefan Monnier
0 siblings, 1 reply; 21+ messages in thread
From: Elena @ 2010-07-27 15:12 UTC (permalink / raw)
To: help-gnu-emacs
Hello,
I've noticed that some user contributed packages redefine standard
functions or variables.
I wonder whether there is a way to catch such redefinitions whenever
they happen (which also would help when accidentally redefining
something) besides rewriting "defun", "defvar", ecc.
Moreover, I wonder whether redefining a function by means of "defun"
gets same results as assigning a new function to a symbol using
"fset".
Thanks.
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Redefining functions and variables
2010-07-27 15:12 Redefining functions and variables Elena
@ 2010-07-27 20:21 ` Stefan Monnier
2010-07-27 22:16 ` Elena
0 siblings, 1 reply; 21+ messages in thread
From: Stefan Monnier @ 2010-07-27 20:21 UTC (permalink / raw)
To: help-gnu-emacs
> I've noticed that some user contributed packages redefine standard
> functions or variables.
That's usually a bad idea. The better way to do it is via defadvice,
which lets you do it in a way that keeps track of the presence of such
a change and knows how to combine multiple such changes.
> I wonder whether there is a way to catch such redefinitions whenever
> they happen (which also would help when accidentally redefining
> something)
Not sure what you mean by that. I guess that means "no".
> Moreover, I wonder whether redefining a function by means of "defun"
> gets same results as assigning a new function to a symbol using
> "fset".
Mostly, yes. But defun keeps track of the file where the defun happened
(for things like C-h f), whereas fset doesn't do any such thing.
Stefan
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Redefining functions and variables
2010-07-27 20:21 ` Stefan Monnier
@ 2010-07-27 22:16 ` Elena
2010-07-28 0:35 ` Andreas Politz
0 siblings, 1 reply; 21+ messages in thread
From: Elena @ 2010-07-27 22:16 UTC (permalink / raw)
To: help-gnu-emacs
On 27 Lug, 22:21, Stefan Monnier <monn...@iro.umontreal.ca> wrote:
> > I wonder whether there is a way to catch such redefinitions whenever
> > they happen (which also would help when accidentally redefining
> > something)
>
> Not sure what you mean by that.
Let's assume we have two definitions for the same function:
;; File A (loaded first)
(defun foo ()
...
;; File B (loaded later)
(defun foo () ;; This is a redefinition: I'd like to get a warning.
...
Since redefining functions is the heart of interactive programming,
such a warning should be issued only while loading files. That way,
you could consider whether to rename the second function or to rewrite
it as an advice (as you suggested).
If such a goal can only be achieved by rewriting "defun" and checking
by means of "fboundp" whether the function has already been defined,
here is my (failed, as noted) attempt:
(defmacro defun (name args &rest body)
`(progn
;; `load-file-name' is not null only if we are loading a file.
(when (and load-file-name
;; FAIL: I don't know how to quote the value of `name'.
(fboundp ,name))
(message "Warning: %s is being redefined in %s."
;; FAIL: I don't know how to quote the value of `name'.
(symbol-name ,name)
load-file-name)
(defun ,name ,args
,@body))))
Any suggestions? Thanks.
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Redefining functions and variables
2010-07-27 22:16 ` Elena
@ 2010-07-28 0:35 ` Andreas Politz
2010-07-28 7:51 ` Elena
0 siblings, 1 reply; 21+ messages in thread
From: Andreas Politz @ 2010-07-28 0:35 UTC (permalink / raw)
To: help-gnu-emacs
Elena <egarrulo@gmail.com> writes:
> On 27 Lug, 22:21, Stefan Monnier <monn...@iro.umontreal.ca> wrote:
>> > I wonder whether there is a way to catch such redefinitions whenever
>> > they happen (which also would help when accidentally redefining
>> > something)
>>
>> Not sure what you mean by that.
>
> Let's assume we have two definitions for the same function:
>
> ;; File A (loaded first)
> (defun foo ()
> ...
>
> ;; File B (loaded later)
> (defun foo () ;; This is a redefinition: I'd like to get a warning.
> ...
>
> Since redefining functions is the heart of interactive programming,
> such a warning should be issued only while loading files. That way,
> you could consider whether to rename the second function or to rewrite
> it as an advice (as you suggested).
>
I think `defun' does not take no advice.
> If such a goal can only be achieved by rewriting "defun" and checking
> by means of "fboundp" whether the function has already been defined,
> here is my (failed, as noted) attempt:
>
> (defmacro defun (name args &rest body)
> `(progn
> ;; `load-file-name' is not null only if we are loading a file.
> (when (and load-file-name
> ;; FAIL: I don't know how to quote the value of `name'.
> (fboundp ,name))
(fboundp ',name))
Why not use `quote'.
> (message "Warning: %s is being redefined in %s."
> ;; FAIL: I don't know how to quote the value of `name'.
> (symbol-name ,name)
> load-file-name)
> (defun ,name ,args
Of course this leads to an endless recursive loop, expanding your macro
again and again ...
(funcall (symbol-function 'defun) 'foo nil)
does not seem to work either, which would mean that you can't save
`defun's definition.
>
> ,@body))))
>
> Any suggestions? Thanks.
-ap
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Redefining functions and variables
2010-07-28 0:35 ` Andreas Politz
@ 2010-07-28 7:51 ` Elena
2010-07-28 14:29 ` Elena
0 siblings, 1 reply; 21+ messages in thread
From: Elena @ 2010-07-28 7:51 UTC (permalink / raw)
To: help-gnu-emacs
On Jul 28, 12:35 am, Andreas Politz <poli...@fh-trier.de> wrote:
> Why not use `quote'.
Because it didn't work. This:
(fboundp ',name))
was expanded by `macroexpand' to:
(fboundp ...)) ;; Exactly as shown.
Using `quote' like this:
(fboundp (quote ,name)))
I got the same result.
> Of course this leads to an endless recursive loop, expanding your macro
> again and again ...
Then I should have tested the macro with `macroexpand-all' instead of
`macroexpand'. However, I've tried using the macro, and it seemed to
work, albeit it choked on the unquoted symbol passed to `fboundp'.
> (funcall (symbol-function 'defun) 'foo nil)
> does not seem to work either, which would mean that you can't save
> `defun's definition.
`defun' is not a function, it's a macro (defined in C source code).
Thanks for answering.
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Redefining functions and variables
2010-07-28 7:51 ` Elena
@ 2010-07-28 14:29 ` Elena
2010-07-28 18:48 ` Andreas Politz
0 siblings, 1 reply; 21+ messages in thread
From: Elena @ 2010-07-28 14:29 UTC (permalink / raw)
To: help-gnu-emacs
On Jul 28, 7:51 am, Elena <egarr...@gmail.com> wrote:
> > Of course this leads to an endless recursive loop, expanding your macro
> > again and again ...
>
> Then I should have tested the macro with `macroexpand-all' instead of
> `macroexpand'. However, I've tried using the macro, and it seemed to
> work, albeit it choked on the unquoted symbol passed to `fboundp'.
I think it seemed to work because the macro was interpreted, therefore
it was expanded only once before the failure.
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Redefining functions and variables
2010-07-28 14:29 ` Elena
@ 2010-07-28 18:48 ` Andreas Politz
2010-07-28 20:37 ` Pascal J. Bourguignon
0 siblings, 1 reply; 21+ messages in thread
From: Andreas Politz @ 2010-07-28 18:48 UTC (permalink / raw)
To: help-gnu-emacs
Elena <egarrulo@gmail.com> writes:
> On Jul 28, 7:51 am, Elena <egarr...@gmail.com> wrote:
>> > Of course this leads to an endless recursive loop, expanding your macro
>> > again and again ...
>>
>> Then I should have tested the macro with `macroexpand-all' instead of
>> `macroexpand'. However, I've tried using the macro, and it seemed to
>> work, albeit it choked on the unquoted symbol passed to `fboundp'.
>
> I think it seemed to work because the macro was interpreted, therefore
> it was expanded only once before the failure.
Don't know, but defining `defun' as a macro usually deletes the original
subst (which is a special form, which is kind of like a macro).
(defvar defun-subst (symbol-function 'defun))
(defmacro defun (name args &rest body)
`(defun ,name ,args ,@body))
(defun foo ())
;; Enters the debugger because of recursion limit reached.
;; Restore original defun
(fset 'defun defun-subst)
-ap
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Redefining functions and variables
2010-07-28 18:48 ` Andreas Politz
@ 2010-07-28 20:37 ` Pascal J. Bourguignon
2010-07-29 8:32 ` Elena
0 siblings, 1 reply; 21+ messages in thread
From: Pascal J. Bourguignon @ 2010-07-28 20:37 UTC (permalink / raw)
To: help-gnu-emacs
Andreas Politz <politza@fh-trier.de> writes:
> Elena <egarrulo@gmail.com> writes:
>
>> On Jul 28, 7:51 am, Elena <egarr...@gmail.com> wrote:
>>> > Of course this leads to an endless recursive loop, expanding your macro
>>> > again and again ...
>>>
>>> Then I should have tested the macro with `macroexpand-all' instead of
>>> `macroexpand'. However, I've tried using the macro, and it seemed to
>>> work, albeit it choked on the unquoted symbol passed to `fboundp'.
>>
>> I think it seemed to work because the macro was interpreted, therefore
>> it was expanded only once before the failure.
>
> Don't know, but defining `defun' as a macro usually deletes the original
> subst (which is a special form, which is kind of like a macro).
>
> (defvar defun-subst (symbol-function 'defun))
>
> (defmacro defun (name args &rest body)
> `(defun ,name ,args ,@body))
>
> (defun foo ())
> ;; Enters the debugger because of recursion limit reached.
>
> ;; Restore original defun
> (fset 'defun defun-subst)
Another way:
(defvar old-defun 'defun) ; the symbol!
(unintern 'defun)
(defmacro defun (name args &rest body)
`(progn
(message "defining %S" name)
(,old-defun ,name ,args ,@body)))
In this case there's no infinite recursion.
--
__Pascal Bourguignon__ http://www.informatimago.com/
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Redefining functions and variables
2010-07-28 20:37 ` Pascal J. Bourguignon
@ 2010-07-29 8:32 ` Elena
2010-07-29 9:57 ` Stefan Monnier
` (2 more replies)
0 siblings, 3 replies; 21+ messages in thread
From: Elena @ 2010-07-29 8:32 UTC (permalink / raw)
To: help-gnu-emacs
On Jul 28, 8:37 pm, p...@informatimago.com (Pascal J. Bourguignon)
wrote:
> Andreas Politz <poli...@fh-trier.de> writes:
> > Elena <egarr...@gmail.com> writes:
>
> >> On Jul 28, 7:51 am, Elena <egarr...@gmail.com> wrote:
> >>> > Of course this leads to an endless recursive loop, expanding your macro
> >>> > again and again ...
>
> >>> Then I should have tested the macro with `macroexpand-all' instead of
> >>> `macroexpand'. However, I've tried using the macro, and it seemed to
> >>> work, albeit it choked on the unquoted symbol passed to `fboundp'.
>
> >> I think it seemed to work because the macro was interpreted, therefore
> >> it was expanded only once before the failure.
>
> > Don't know, but defining `defun' as a macro usually deletes the original
> > subst (which is a special form, which is kind of like a macro).
>
> > (defvar defun-subst (symbol-function 'defun))
>
> > (defmacro defun (name args &rest body)
> > `(defun ,name ,args ,@body))
>
> > (defun foo ())
> > ;; Enters the debugger because of recursion limit reached.
>
> > ;; Restore original defun
> > (fset 'defun defun-subst)
>
> Another way:
>
> (defvar old-defun 'defun) ; the symbol!
> (unintern 'defun)
>
> (defmacro defun (name args &rest body)
> `(progn
> (message "defining %S" name)
> (,old-defun ,name ,args ,@body)))
This is very close to what I was looking for. Thanks, Pascal.
My modified macro is below. Why ',name is expanded as ... (as shown by
`macroexpand-all'?
(defvar old-defun 'defun) ; the symbol!
(unintern 'defun)
(defmacro defun (name args &rest body)
`(progn
;; `load-file-name' is not null only if we are loading a
file.
(when (and load-file-name
(fboundp ',name))
(message "Warning: %s is being redefined in %s."
(symbol-name ',name)
load-file-name)
(,old-defun ,name ,args
,@body))))
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Redefining functions and variables
2010-07-29 8:32 ` Elena
@ 2010-07-29 9:57 ` Stefan Monnier
2010-07-29 10:16 ` Elena
` (2 more replies)
2010-07-29 10:03 ` Pascal J. Bourguignon
2010-07-29 20:35 ` Johan Bockgård
2 siblings, 3 replies; 21+ messages in thread
From: Stefan Monnier @ 2010-07-29 9:57 UTC (permalink / raw)
To: help-gnu-emacs
> (defmacro defun (name args &rest body)
Just as is the case for `defun', redefining macros with `defmacro'
is problematic. I really recommend not to do that and use defadvice
instead, which was designed specifically for this purpose.
Stefan
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Redefining functions and variables
2010-07-29 8:32 ` Elena
2010-07-29 9:57 ` Stefan Monnier
@ 2010-07-29 10:03 ` Pascal J. Bourguignon
2010-07-29 10:28 ` Elena
2010-07-29 20:35 ` Johan Bockgård
2 siblings, 1 reply; 21+ messages in thread
From: Pascal J. Bourguignon @ 2010-07-29 10:03 UTC (permalink / raw)
To: help-gnu-emacs
Elena <egarrulo@gmail.com> writes:
> My modified macro is below. Why ',name is expanded as ... (as shown by
> `macroexpand-all'?
>
> (defvar old-defun 'defun) ; the symbol!
> (unintern 'defun)
>
> (defmacro defun (name args &rest body)
> `(progn
> ;; `load-file-name' is not null only if we are loading a
> file.
> (when (and load-file-name
> (fboundp ',name))
> (message "Warning: %s is being redefined in %s."
> (symbol-name ',name)
> load-file-name)
> (,old-defun ,name ,args
> ,@body))))
It is not.
(macroexpand '(defun. test (a) (+ 1 a)))
;; --> (progn (when (and load-file-name (fboundp (quote test))) (message "Warning: %s is being redefined in %s." (symbol-name (quote test)) load-file-name) (defun test (a) (+ 1 a))))
the "..." are only used to display the list when print-length or
eval-expression-print-length are not nil. See also print-level and
eval-expression-print-level.
%s can format symbols too:
(format ">> %s <<" 'example)
;; --> ">> example <<"
And you had your the old defun inside the when!
(defmacro defun (name args &rest body)
`(progn
;; `load-file-name' is not null only if we are loading a file.
(when (and load-file-name (fboundp ',name))
(message "Warning: %s is being redefined in %s." ',name load-file-name))
(,old-defun ,name ,args ,@body)))
Note: while name is known at macroexpansion time, you should refrain
to insert it in the string like this:
(message ,(format "Warning: %s is being redefined in %%s." name) load-file-name)
since name could contain percents and then you'd have build a wrong
format string for message. If you want to do that, you must escape
the percents:
(message ,(format "Warning: %s is being redefined in %%s."
(escape-percent name))
load-file-name)
with:
(defun escape-percent (string-designator)
(let ((string (etypecase string-designator
(string string-designator)
(symbol (symbol-name string-designator))
(character (string string-designator)))))
(unsplit-string (split-string string "%" nil) "%%")))
(defun unsplit-string (string-list &rest separator)
"Does the inverse than split-string. If no separator is provided
then a simple space is used."
(if (null separator)
(setq separator " ")
(if (= 1 (length separator))
(setq separator (car separator))
(error "unsplit-string: Too many separator arguments.")))
(if (not (char-or-string-p separator))
(error "unsplit-string: separator must be a string or a char."))
(apply 'concat (list-insert-separator string-list separator)))
(mapcar 'escape-percent '("abc" abc % %make- make-10%-of-profit %%internal%%))
;; --> ("abc" "abc" "%%" "%%make-" "make-10%%-of-profit" "%%%%internal%%%%")
--
__Pascal Bourguignon__ http://www.informatimago.com/
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Redefining functions and variables
2010-07-29 9:57 ` Stefan Monnier
@ 2010-07-29 10:16 ` Elena
2010-07-29 13:14 ` Stefan Monnier
2010-07-30 19:32 ` Uday S Reddy
2010-07-29 10:31 ` Andreas Politz
2010-07-29 12:41 ` Tim X
2 siblings, 2 replies; 21+ messages in thread
From: Elena @ 2010-07-29 10:16 UTC (permalink / raw)
To: help-gnu-emacs
On Jul 29, 9:57 am, Stefan Monnier <monn...@iro.umontreal.ca> wrote:
> Just as is the case for `defun', redefining macros with `defmacro'
> is problematic. I really recommend not to do that and use defadvice
> instead, which was designed specifically for this purpose.
Do you mean macros can be adviced too? Something like this (it does
not compile):
(defadvice defun (before redefinition-warning activate)
(let ((name (ad-get-arg 0)))
(when (and load-file-name
(fboundp (symbol name)))
(message "Warning: %s is being redefined in %s."
(symbol-name name)
load-file-name))))
?
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Redefining functions and variables
2010-07-29 10:03 ` Pascal J. Bourguignon
@ 2010-07-29 10:28 ` Elena
0 siblings, 0 replies; 21+ messages in thread
From: Elena @ 2010-07-29 10:28 UTC (permalink / raw)
To: help-gnu-emacs
On Jul 29, 10:03 am, p...@informatimago.com (Pascal J. Bourguignon)
wrote:
> the "..." are only used to display the list when print-length or
> eval-expression-print-length are not nil. See also print-level and
> eval-expression-print-level.
Didn't know about this. Thanks.
> %s can format symbols too:
>
> (format ">> %s <<" 'example)
> ;; --> ">> example <<"
>
> And you had your the old defun inside the when!
Gosh! What an oversight... Sorry.
> Note: while name is known at macroexpansion time, you should refrain
> to insert it in the string like this:
>
> (message ,(format "Warning: %s is being redefined in %%s." name) load-file-name)
>
> since name could contain percents and then you'd have build a wrong
> format string for message.
I don't understand this. Doc about `message' says:
> Note: Use (message "%s" VALUE) to print the value of expressions and
> variables to avoid accidentally interpreting `%' as format specifiers.
And in fact:
(message "%s" 'example%)
correctly outputs:
"example%"
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Redefining functions and variables
2010-07-29 9:57 ` Stefan Monnier
2010-07-29 10:16 ` Elena
@ 2010-07-29 10:31 ` Andreas Politz
2010-07-29 11:46 ` Johan Bockgård
2010-07-29 12:41 ` Tim X
2 siblings, 1 reply; 21+ messages in thread
From: Andreas Politz @ 2010-07-29 10:31 UTC (permalink / raw)
To: help-gnu-emacs
Stefan Monnier <monnier@iro.umontreal.ca> writes:
>> (defmacro defun (name args &rest body)
>
> Just as is the case for `defun', redefining macros with `defmacro'
> is problematic. I really recommend not to do that and use defadvice
> instead, which was designed specifically for this purpose.
>
>
> Stefan
Last time I tried to advice `defun', it gave me a `invalid function'
error or some such.
-ap
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Redefining functions and variables
2010-07-29 10:31 ` Andreas Politz
@ 2010-07-29 11:46 ` Johan Bockgård
2010-07-29 15:54 ` Andreas Politz
0 siblings, 1 reply; 21+ messages in thread
From: Johan Bockgård @ 2010-07-29 11:46 UTC (permalink / raw)
To: help-gnu-emacs
Andreas Politz <politza@fh-trier.de> writes:
> Stefan Monnier <monnier@iro.umontreal.ca> writes:
>
>> Just as is the case for `defun', redefining macros with `defmacro'
>> is problematic. I really recommend not to do that and use defadvice
>> instead, which was designed specifically for this purpose.
>
> Last time I tried to advice `defun', it gave me a `invalid function'
> error or some such.
Emacs chokes on the irregular "[DOCSTRING]" argument:
(defun NAME ARGLIST [DOCSTRING] BODY...)
You have to provide an explicit ARGLIST:
(defadvice FUNCTION (CLASS NAME [POSITION] [ARGLIST] FLAG...)
[DOCSTRING] [INTERACTIVE-FORM]
BODY...)
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Redefining functions and variables
2010-07-29 9:57 ` Stefan Monnier
2010-07-29 10:16 ` Elena
2010-07-29 10:31 ` Andreas Politz
@ 2010-07-29 12:41 ` Tim X
2 siblings, 0 replies; 21+ messages in thread
From: Tim X @ 2010-07-29 12:41 UTC (permalink / raw)
To: help-gnu-emacs
Stefan Monnier <monnier@iro.umontreal.ca> writes:
>> (defmacro defun (name args &rest body)
>
> Just as is the case for `defun', redefining macros with `defmacro'
> is problematic. I really recommend not to do that and use defadvice
> instead, which was designed specifically for this purpose.
>
>
> Stefan
If anyone wants a good example of what can be achieved just using
defadvice, I would strongly recommend looking at emacspeak.
The emacspeak package transforms emacs into a powerful text-to-speech
system. Most of this is achieved by wrapping standard emacs functions in
defadvice, which in turn sends the relevant bit of text to a
text-to-speech synthesizer.
Another similar package, which attempts to have minimal impact on how
emacs works is speechd.el. It also uses defadvice.
I frequently use defadvice to customize how functions work, resolve bugs
while waiting for an update in some package or simply replace one
function with one I have written. It is a very useful and powerful tool.
Tim
--
tcross (at) rapttech dot com dot au
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Redefining functions and variables
2010-07-29 10:16 ` Elena
@ 2010-07-29 13:14 ` Stefan Monnier
2010-07-30 19:32 ` Uday S Reddy
1 sibling, 0 replies; 21+ messages in thread
From: Stefan Monnier @ 2010-07-29 13:14 UTC (permalink / raw)
To: help-gnu-emacs
>> Just as is the case for `defun', redefining macros with `defmacro'
>> is problematic. I really recommend not to do that and use defadvice
>> instead, which was designed specifically for this purpose.
> Do you mean macros can be adviced too?
That's not what I meant (I meant to redefine with `defadvice' rather than
with `defun'), but that's also the case (i.e. redefine with defadvice
rather than with defmacro).
Stefan
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Redefining functions and variables
2010-07-29 11:46 ` Johan Bockgård
@ 2010-07-29 15:54 ` Andreas Politz
0 siblings, 0 replies; 21+ messages in thread
From: Andreas Politz @ 2010-07-29 15:54 UTC (permalink / raw)
To: help-gnu-emacs
Johan Bockgård <bojohan+news@gnu.org> writes:
> Andreas Politz <politza@fh-trier.de> writes:
>
>> Stefan Monnier <monnier@iro.umontreal.ca> writes:
>>
>>> Just as is the case for `defun', redefining macros with `defmacro'
>>> is problematic. I really recommend not to do that and use defadvice
>>> instead, which was designed specifically for this purpose.
>>
>> Last time I tried to advice `defun', it gave me a `invalid function'
>> error or some such.
>
> Emacs chokes on the irregular "[DOCSTRING]" argument:
>
> (defun NAME ARGLIST [DOCSTRING] BODY...)
>
> You have to provide an explicit ARGLIST:
>
> (defadvice FUNCTION (CLASS NAME [POSITION] [ARGLIST] FLAG...)
> [DOCSTRING] [INTERACTIVE-FORM]
> BODY...)
Ah, ok - thank you. I guess, I did not ivestigate it very much back
then.
-ap
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Redefining functions and variables
2010-07-29 8:32 ` Elena
2010-07-29 9:57 ` Stefan Monnier
2010-07-29 10:03 ` Pascal J. Bourguignon
@ 2010-07-29 20:35 ` Johan Bockgård
2010-07-29 22:22 ` Tim X
2 siblings, 1 reply; 21+ messages in thread
From: Johan Bockgård @ 2010-07-29 20:35 UTC (permalink / raw)
To: help-gnu-emacs
Elena <egarrulo@gmail.com> writes:
>> (defmacro defun (name args &rest body)
>> `(progn
>> (message "defining %S" name)
>> (,old-defun ,name ,args ,@body)))
>
> This is very close to what I was looking for.
Note that neither defadvice nor redefinition of defun will work for
(already) byte compiled code.
(byte-compile (lambda () (defun foo ()))) =>
#[nil "..." [defalias foo #[nil "..." [nil] 1]] 3]
^
no `defun' after byte compilation
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Redefining functions and variables
2010-07-29 20:35 ` Johan Bockgård
@ 2010-07-29 22:22 ` Tim X
0 siblings, 0 replies; 21+ messages in thread
From: Tim X @ 2010-07-29 22:22 UTC (permalink / raw)
To: help-gnu-emacs
Johan Bockgård <bojohan+news@gnu.org> writes:
> Elena <egarrulo@gmail.com> writes:
>
>>> (defmacro defun (name args &rest body)
>>> `(progn
>>> (message "defining %S" name)
>>> (,old-defun ,name ,args ,@body)))
>>
>> This is very close to what I was looking for.
>
> Note that neither defadvice nor redefinition of defun will work for
> (already) byte compiled code.
>
>
> (byte-compile (lambda () (defun foo ()))) =>
>
> #[nil "..." [defalias foo #[nil "..." [nil] 1]] 3]
> ^
> no `defun' after byte compilation
Not sure what you mean here, but I have lots of defadvice that is
defined for functions that are already defined and byte compiled which
work fine i.e. I use defadvice to advise standard emacs lisp functions
regularly without problems.
Tim
--
tcross (at) rapttech dot com dot au
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Redefining functions and variables
2010-07-29 10:16 ` Elena
2010-07-29 13:14 ` Stefan Monnier
@ 2010-07-30 19:32 ` Uday S Reddy
1 sibling, 0 replies; 21+ messages in thread
From: Uday S Reddy @ 2010-07-30 19:32 UTC (permalink / raw)
To: help-gnu-emacs
On 7/29/2010 11:16 AM, Elena wrote:
> On Jul 29, 9:57 am, Stefan Monnier<monn...@iro.umontreal.ca> wrote:
>> Just as is the case for `defun', redefining macros with `defmacro'
>> is problematic. I really recommend not to do that and use defadvice
>> instead, which was designed specifically for this purpose.
>
> Do you mean macros can be adviced too? Something like this (it does
> not compile):
No, Stefan is advising you not to mess with defun or defmacro.
These are essentially fundamental built-in operations of Elisp and changing
them can produce very strange behaviors.
If you are trying to use user-contributed packages that are redefining standard
Emacs functions, then you should seriously consider whether you should use such
packages. Emacs doesn't enforce the quality of packages you use. You do.
Cheers,
Uday
^ permalink raw reply [flat|nested] 21+ messages in thread
end of thread, other threads:[~2010-07-30 19:32 UTC | newest]
Thread overview: 21+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-07-27 15:12 Redefining functions and variables Elena
2010-07-27 20:21 ` Stefan Monnier
2010-07-27 22:16 ` Elena
2010-07-28 0:35 ` Andreas Politz
2010-07-28 7:51 ` Elena
2010-07-28 14:29 ` Elena
2010-07-28 18:48 ` Andreas Politz
2010-07-28 20:37 ` Pascal J. Bourguignon
2010-07-29 8:32 ` Elena
2010-07-29 9:57 ` Stefan Monnier
2010-07-29 10:16 ` Elena
2010-07-29 13:14 ` Stefan Monnier
2010-07-30 19:32 ` Uday S Reddy
2010-07-29 10:31 ` Andreas Politz
2010-07-29 11:46 ` Johan Bockgård
2010-07-29 15:54 ` Andreas Politz
2010-07-29 12:41 ` Tim X
2010-07-29 10:03 ` Pascal J. Bourguignon
2010-07-29 10:28 ` Elena
2010-07-29 20:35 ` Johan Bockgård
2010-07-29 22:22 ` Tim X
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).