名前空間を汚さずデバッグ出力関数を定義
Emacs Lisp を書いていると、 message 関数なんかを使って printf デバッグをしたりすることもあると思います。
しかし、 Emacs Lisp が namespace みたいなものを持っていないため、短い名前の関数をつけてしまうとどこかで競合するんじゃないかと不安になります。
かといって、使う場所が多いデバッグ用の関数に長い名前をつけるのもだるいです。
そこで、グローバルな名前空間を汚さないようにしつつ短い名前のデバッグ関数を定義してみました。
(labels ((dmessage (string &rest arg) (apply 'message string arg) )) (dmessage "a%s %s" "a" "b") ) ; => "aa b" (dmessage "a%s %s" "a" "b") ; => Debugger entered--Lisp error: (void-function dmessage)
関数 dmessage は labals スコープの中だけ有効な関数で、外のスコープには影響しません。
リリース時に関数 dmessage を無効にするためには
(labels ((dmessage (string &rest arg) ;;(apply 'message string arg) )) (dmessage "a%s %s" "a" "b") ) ; => nil (dmessage "a%s %s" "a" "b") ; => Debugger entered--Lisp error: (void-function dmessage)
と apply 以下をコメントアウトしてあげれば大丈夫です。
flet や letf は関数の置き換えはできるんですが、グローバルな関数は定義しないといけないみたいでした (やり方が悪いだけかもしれませんが)
他にも let と funcall を使用する方法もあるんですが、呼び出し部分で何度も funcall を書く必要があるのが微妙な感じです。
以下のページを参考にしました。
http://d.hatena.ne.jp/kitokitoki/20090903/p1
http://d.hatena.ne.jp/kitokitoki/20090925/p2
どうもありがとうございます。