Sunday, May 11, 2014

elisp関数を一時的に別な名前へ置き換える

Emacs Lisp の関数名を一時的に別な名前へ置き換えたい件で、 何使えばいいのかもよくわからないのでマニュアルを斜め読みした話。

ネットを漁ったところ defalias なるものがどうもよさげ、ということで以下なマニュアルを読む。

12.4 Defining Functions

結論。どうもそういった用途には defalias でなく fset を使うものらしい。サンプルは次回ポストするとして。

以下、メモ。ついでに defun についてもマジメに再確認。

defun name args [ doc ] [ declare ] [ interactive ] body

関数の定義は defun マクロでなされる。シンボル名を関数として定義する。

defun のフォームに見慣れない declare なるものが。 これは関数を obsolete として扱うなど特別な効果がある模様。 詳しくは 12.12 The declare Form 参照ってことで今回はスルー。

既存の関数の再定義に注意とある。関数の再定義は意図して行われることもあるため許されているらしい。

defalias name definition &optional doc

すでにある関数シンボル definition をシンボル name で定義するとある。 doc があれば name のドキュメントに使われるけど、なければ definition のものが使われると。

defalias の使いどころは、ソースコードの中に明示的に名前があらわれるようなところ。 defalias は、どのファイルに関数が定義されてるか記録するから。 defun も記録する。 この記録は unload-feature 関数でのアンロードに使われる模様。

この記録ってのが不要なら fset でいい模様。

あと car みたいなプリミティブな関数のシンボルの再定義はリスキーとある。

どうなるか一度試してみますか。