开发者

difference between (defalias 'A (symbol-function 'B)) and (defalias 'A 'B)

开发者 https://www.devze.com 2022-12-08 00:07 出处:网络
I was reading subr.el and saw this code: (defalias \'backward-delete-char \'delete-backward-char) (defalias \'search-forward-regexp (symbol-function \'re-search-forward))

I was reading subr.el and saw this code:

(defalias 'backward-delete-char 'delete-backward-char)
(defalias 'search-forward-regexp (symbol-function 're-search-forward))

Interestingly, the first line doesn't use symbol-function while the second line does. The only difference I know of these two ways of using defalias is that the help for backward-delet开发者_运维知识库e-char (the first one) displays that it is an alias for delete-backward-char while the help for search-forward-regexp doesn't.

Is there a case when the second way is better than the first way?


The two defalias usages are slightly different. The first links the function cell for 'backward-delete-char to that of 'delete-backward-char. The second links the 'search-forward-regexp to the function that is currently called by 're-search-forward.

The difference is that if you later change the definition of 'delete-backward-char, 'backward-delete-char will now have the new behavior. Whereas in the second case, changing the function for 're-search-forward has no effect on the behavior of 'search-forward-regexp.

Perhaps some ascii art can help:

+-------------------------+     +-----------------+
|#<subr re-search-forward>| <-- |re-search-forward|
+-------------------------+     +-----------------+
                        ^       +---------------------+
                        \------ |search-forward-regexp|
                                +---------------------+

+----------------------------+     +--------------------+     +--------------------+
|#<subr delete-backward-char>| <-- |delete-backward-char| <-- |backward-delete-char|
+----------------------------+     +--------------------+     +--------------------+

This documentation might help clear things up.


Well, it really is not the same thing... Here is a little game I just played:

(defun a () (message "hello"))
a
(a)
"hello"
(defalias 'b (symbol-function 'a))
(lambda nil (message "hello"))
(defalias 'c 'a)
a
(b)
"hello"
(c)
"hello"
(defun a () (message "howdy"))
a
(a)
"howdy"
(b)
"hello"
(c)
"howdy" ' c changed meaning, b did not...
0

精彩评论

暂无评论...
验证码 换一张
取 消