2009-10-09 17 views
23

estaba leyendo subr.el y vi este código:diferencia entre (A '(símbolo de la función' defalias B)) y ('A 'defalias B)

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

Curiosamente, la primera línea doesn' t usa la función de símbolo mientras que la segunda línea lo hace. La única diferencia que conozco de estas dos formas de usar defalias es que la ayuda para backward-delete-char (la primera) muestra que es un alias para delete-backward-char, mientras que la ayuda para search-forward-regexp doesn ' t.

¿Hay algún caso cuando la segunda forma es mejor que la primera?

Respuesta

31

Los dos defalias usos son ligeramente diferentes. El primero vincula la celda de función para 'backward-delete-char a la de 'delete-backward-char. El segundo vincula el 'search-forward-regexp a la función a la que actualmente se llama 're-search-forward.

La diferencia es que si posteriormente cambia la definición de "delete-backward-char, 'backward-delete-char tendrán ahora el nuevo comportamiento. Mientras que en el segundo caso, cambiar la función para 're-search-forward no tiene efecto en el comportamiento de 'search-forward-regexp.

Tal vez un poco de arte ASCII pueden ayudar:

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

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

Este documentation podría ayudar a aclarar las cosas.

+3

+1 para una implementación de ascii binky. – quodlibetor

2

Bueno, en realidad no es la misma cosa ... Aquí es un pequeño juego que yo en el:

(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

Porque 'b' tenía un alias para la definición de función y' c' tenía un alias al símbolo –

Cuestiones relacionadas