elisp マクロの名前を変更するにはどうすればよいですか? defunより正確には、 makeを のシノニムにしたいと考えていcl-defunます。時間やメモリのオーバーヘッドは気にしません。
3 に答える
概要
私はあなたがそれを行うことができるとは思わない - 少なくとも簡単ではありません.
cl-defunに展開されるため、明らかな を実行すると、defun使用時に無限のマクロ展開ループが発生します。defun(defalias 'defun 'cl-defun)
それは方法です...
だからあなたがする必要があるのは
元の保存
defun:(fset 'defun-original (symbol-function 'defun)).cl-defuninの定義をコピーして、cl-macs.elに置き換えます。defundefun-original:
defunをcl-defun使用して置き換えます。defalias(defalias 'defun 'cl-defun)
少なくとも、事態が悪化した場合は、 を使用して元の動作を復元できます(fset 'defun (symbol-function 'defun-original))。
...しかし、あなたはそれを望んでいません
しかし、私はあなたが本当にそれをしたくないと思います。
Common Lisp を使用 したい場合は、それを使用してください。Elisp を CL に変えることができるふりをしようとすると、悲しみしか生じません。私は15年前にその道を旅しようとしました - そこには楽しいものはありません. 少なくともレキシカル バインディングがあるので、今はもっと簡単になっているはずですが、それでも努力する価値があるとは思いません。
を拡張したい場合Emacs、 を使用cl-defunするのはさらに意味がありません: あなたの拡張機能は他の人にとって役に立たず、助けを求めることさえできません。小さなゲイン。
一般に、シノニムは と非常に簡単に作成できます(defalias 'foo 'cl-defun)。しかし、呼び出しの展開は をcl-defun使用するdefunため、(defalias 'defun 'cl-defun) を使用すると、無限ループに陥ります。
calが機能を使用するかどうかに応じて、何をするか、または何をするかのdefunいずれかを行うマクロに置き換えることで、おそらく必要なものを得ることができます。たとえば、(Emacs のトランクにあります。古い Emacsen で使用して同様の結果を得ることができます) を使用すると、以下のテストされていないコードのようになります。defuncl-defuncl-defunadvice-adddefadvice
(defun my-defun-dispatch (doit name args &rest body)
(let ((needs-cl nil))
(dolist (arg args)
(unless (and (symbolp arg)
(or (not (eq ?& (aref (symbol-name arg) 0)))
(memq arg '(&optional &rest))))
(setq needs-cl t)))
(if needs-cl
`(cl-defun ,name ,args ,@body)
(funcall doit name args body))))
(advice-add :around 'defun 'my-defun-dispatch)