24

私はsubr.elを読んでいて、このコードを見ました:

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

興味深いことに、最初の行はシンボル関数を使用していませんが、2番目の行は使用しています。defaliasを使用するこれらの2つの方法について私が知っている唯一の違いは、backward-delete-char(最初の方法)のヘルプでは、delete-backward-charのエイリアスであると表示されますが、search-forward-regexpのヘルプでは表示されないことです。 t。

2番目の方法が最初の方法よりも優れている場合はありますか?

4

2 に答える 2

35

2つのdefalias使用法は少し異なります。1つ目は、の関数セルをの関数セルにリンクし'backward-delete-charます'delete-backward-char'search-forward-regexp2つ目は、によって現在呼び出されている関数にをリンクします're-search-forward

違いは、後で'の定義を変更すると、新しい動作delete-backward-charになることです。'backward-delete-char一方、2番目のケースでは、の関数を変更し're-search-forwardても、の動作には影響しません'search-forward-regexp

おそらく、いくつかのアスキーアートが役立ちます:

+-------------------------+     +-----------------+
|#<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 に答える