разница между (defalias 'A (символ-функция' B)) и (defalias 'A' B) - PullRequest
24 голосов
/ 10 октября 2009

Я читал subr.el и увидел этот код:

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

Интересно, что первая строка не использует символьную функцию, а вторая строка. Единственное различие, которое я знаю об этих двух способах использования defalias, заключается в том, что справка для backward-delete-char (первая) показывает, что это псевдоним для delete-backward-char, а справка для search-forward-regexp не ' т.

Есть ли случай, когда второй способ лучше первого?

Ответы [ 2 ]

34 голосов
/ 10 октября 2009

Два 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|
+----------------------------+     +--------------------+     +--------------------+

Эта документация может помочь прояснить ситуацию.

2 голосов
/ 10 октября 2009

Ну, это действительно не то же самое ... Вот небольшая игра, в которую я только что играл:

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