如何定义不返回任何内容的宏

问题描述 投票:0回答:1

背景

我看到问题禁用代码的最佳方法

我认为像下面这样的东西会很好:

(off
  (global-set-key "\C-x" 'do-stuff)
  (defun do-stuff () ...))

我知道我可以自己定义

off
,但是没有标准的方法吗?

相应的答案gigiair

(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 中,有什么可以不返回不保留任何内容 吗?

lisp common-lisp elisp
1个回答
0
投票

你不能定义一个扩展为空的宏,因为 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

© www.soinside.com 2019 - 2024. All rights reserved.