2

いくつかの基本的な機能をオーバーライドしたいと思います。たとえば、save-buffer としましょう (たとえ意味がなくても、わかりやすくするためです)、それに新しい定義を与えます。しかし、Cu を追加することで、すべての元の動作を呼び出せるようにしたいと考えています。

そう、

  • Cx Cs は、save-buffer の私の新しい定義になります。

  • Cu Cx Cs は元の Cx Cs を呼び出します (引数なし)

  • Cu Cu Cx Cs は、 1 つのCuで元の Cx Cs を呼び出すのと同じです。

など: 常に「1 つ少ない」Cu...

現在、arg の値をテストしています。nil の場合、新しい定義を実行します。それ以外の場合は、インタラクティブに save-buffer を呼び出します (例として)。ただし、save-buffer は 1 つの Cu 引数で呼び出されます。「-1」の Cu 部分のやり方がわかりません。

4

1 に答える 1

5

これを行う1つの方法は次のとおりです。

(defun foo (arg)
  (interactive "p")
  (message "foo %s" arg))

(defun bar (arg)
  (interactive "p")
  (message "bar %s" arg))

(defmacro wrap (fg f g)
  `(defun ,fg (arg)
     (interactive "p")
     (message "%s" arg)
     (if (= 1 arg)
         (funcall ,g 1)
       (funcall ,f (/ arg 4)))))

(wrap baz #'foo #'bar)

プレーンbazが を呼び出すようになりbarました。指定された arg を 4 で除算してC-u を呼び出します。foo

于 2013-10-12T20:06:14.777 に答える