(defalias'A(符号 - 函数'B))和(defalias'A'B)之间的差异

时间:2009-10-09 20:51:48

标签: emacs function elisp alias

我正在阅读subr.el并看到了这段代码:

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

有趣的是,第一行不使用符号函数,而第二行不使用符号函数。我知道这两种使用defalias的方法的唯一区别是对reverse-delete-char(第一个)的帮助显示它是delete-backward-char的别名,而search-forward-regexp的帮助没有吨。

是否存在第二种方式比第一种方式更好的情况?

2 个答案:

答案 0 :(得分:34)

两个defalias用法略有不同。第一个将'backward-delete-char的函数单元格链接到'delete-backward-char的函数单元格。第二个将'search-forward-regexp链接到're-search-forward当前调用的函数。

不同之处在于,如果您稍后更改“delete-backward-char的定义,'backward-delete-char现在将具有新行为。而在第二种情况下,更改're-search-forward的功能对'search-forward-regexp的行为没有影响。

也许一些ascii艺术可以提供帮助:

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

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

documentation可能有助于澄清问题。

答案 1 :(得分:2)

嗯,这真的不一样......这是我刚刚玩的一个小游戏:

(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...