2

elisp マクロの名前を変更するにはどうすればよいですか? defunより正確には、 makeを のシノニムにしたいと考えていcl-defunます。時間やメモリのオーバーヘッドは気にしません。

4

3 に答える 3

4

概要

私はあなたがそれを行うことができるとは思わない - 少なくとも簡単ではありません.

cl-defunに展開されるため、明らかな を実行すると、defun使用時に無限のマクロ展開ループが発生します。defun(defalias 'defun 'cl-defun)

それは方法です...

だからあなたがする必要があるのは

  1. 元の保存defun: (fset 'defun-original (symbol-function 'defun)).

  2. cl-defuninの定義をコピーして、cl-macs.elに置き換えます。defundefun-original

  3. :defuncl-defun使用して置き換えます。defalias(defalias 'defun 'cl-defun)

少なくとも、事態が悪化した場合は、 を使用して元の動作を復元できます(fset 'defun (symbol-function 'defun-original))

...しかし、あなたはそれを望んでいません

しかし、私はあなたが本当にそれをしたくないと思います。

Common Lisp を使用 したい場合は、それを使用してください。Elisp を CL に変えることができるふりをしようとすると、悲しみしか生じません。私は15年前にその道を旅しようとしました - そこには楽しいものはありません. 少なくともレキシカル バインディングがあるので、今はもっと簡単になっているはずですが、それでも努力する価値があるとは思いません。

を拡張したい場合Emacs、 を使用cl-defunするのはさらに意味がありません: あなたの拡張機能は他の人にとって役に立たず、助けを求めることさえできません。小さなゲイン。

于 2013-04-08T13:32:34.613 に答える
2

一般に、シノニムは と非常に簡単に作成できます(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)
于 2013-04-08T13:38:26.363 に答える