24

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

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

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

是否存在第二种方式优于第一种方式的情况?

4

2 回答 2

35

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

不同之处在于,如果您稍后更改 ' 的定义delete-backward-char'backward-delete-char现在将具有新的行为。而在第二种情况下,更改函数 for'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|
+----------------------------+     +--------------------+     +--------------------+

文档可能有助于解决问题。

于 2009-10-09T21:19:59.903 回答
3

嗯,确实不是一回事……这是我刚玩的一个小游戏:

(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...
于 2009-10-09T21:18:49.707 回答