elisp マクロの名前を変更するにはどうすればよいですか? defun
より正確には、 makeを のシノニムにしたいと考えていcl-defun
ます。時間やメモリのオーバーヘッドは気にしません。
3 に答える
概要
私はあなたがそれを行うことができるとは思わない - 少なくとも簡単ではありません.
cl-defun
に展開されるため、明らかな を実行すると、defun
使用時に無限のマクロ展開ループが発生します。defun
(defalias 'defun 'cl-defun)
それは方法です...
だからあなたがする必要があるのは
元の保存
defun
:(fset 'defun-original (symbol-function 'defun))
.cl-defun
inの定義をコピーして、cl-macs.el
に置き換えます。defun
defun-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 で使用して同様の結果を得ることができます) を使用すると、以下のテストされていないコードのようになります。defun
cl-defun
cl-defun
advice-add
defadvice
(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)