2009-10-09 3 views
23

I subr.el las und sah diesen Code:Differenz zwischen (defalias 'A (Symbol-Funktion' B)) und (defalias ‚A 'B)

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

Interessanterweise ist die erste Zeile' doesn t Verwenden Sie die Symbol-Funktion, während die zweite Zeile funktioniert. Der einzige Unterschied, den ich von diesen beiden Arten der Verwendung von Defalias kenne, ist, dass die Hilfe für das Rückwärts-Löschen-Zeichen (das erste) anzeigt, dass es ein Alias ​​für das Löschen-Rückwärts-Zeichen ist, während die Hilfe für Suchen-Vorwärts-Regexp nicht funktioniert. t.

Gibt es einen Fall, wenn der zweite Weg besser ist als der erste Weg?

Antwort

31

Die beiden defalias Verwendungen sind etwas anders. Der erste verknüpft die Funktionszelle für 'backward-delete-char mit der von 'delete-backward-char. Die zweite verknüpft die 'search-forward-regexp mit der Funktion, die derzeit von 're-search-forward aufgerufen wird.

Der Unterschied ist, dass wenn Sie später die Definition von 'delete-backward-char ändern, 'backward-delete-char jetzt das neue Verhalten haben wird. Während im zweiten Fall die Änderung der Funktion für 're-search-forward keine Auswirkung auf das Verhalten von 'search-forward-regexp hat.

Vielleicht können einige ascii Kunst helfen:

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

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

Diese documentation könnte klare Dinge aufzuhelfen.

+3

+1 wurde. – quodlibetor

2

Nun, es ist wirklich nicht das gleiche ... Hier ist ein kleines Spiel, das ich gespielt:

(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

Da "b" Alias ​​für die Funktionsdefinition war und "c" für eine ascii binky Implementierung Alias ​​für das Symbol –

Verwandte Themen