我看到问题禁用代码的最佳方法:
我认为像下面这样的东西会很好:
(off (global-set-key "\C-x" 'do-stuff) (defun do-stuff () ...))
我知道我可以自己定义
,但是没有标准的方法吗?off
(defun off (&rest args) "Do nothing and return nil." nil)
但是我认为这个解决方案有两个缺点,考虑到每个函数都会评估它的参数和返回一些东西,例如(关于“返回一些东西”):
(custom-set-variables
(off '(display-time-mode t)) ; ==> (), which is non-well-formed
'(blink-cursor-mode nil))
使用
off
函数将导致格式不正确的s-expression(这不是custom-set-variables
所期望的)。
关键可能是定义一些什么都不返回的东西,比如:
(defmacro erase-code (&rest pieces-of-code)
...)
这将使最后一个示例扩展为:
(custom-set-variables
'(blink-cursor-mode nil))
换句话说,它什么也没留下。
也许最终的解决方案不是关于宏观,我不知道。
本质上,我是在问:在 Common Lisp 或 Emacs Lisp 中,有什么可以不返回 或不保留任何内容 吗?
你不能定义一个扩展为空的宏,因为 CL(我认为是 elisp)没有有时被称为“拼接宏”的东西。但是你可以很容易地编写一个扩展为一些固定表达式的宏,例如
nil
:
(defmacro off (&body forms)
(declare (ignore forms))
nil)
这是 Common Lisp:elisp 的等价物应该类似。那么像
这样的东西(defun foo (x)
(off
(when x
(explode-world)))
x)
不会爆炸世界,宏展开的代码中确实没有引用
explode-world
。