Emacs定义一个将参数设置为nil的函数

时间:2013-01-12 10:00:26

标签: function emacs lisp

我想创建一个nil函数,它接受任意数量的符号并将它们全部设置为nil。

(defun clean (as many args as given by user)
  (setq each-arg nil)
)

(clean x y z)

如何'干净'地做到这一点?

2 个答案:

答案 0 :(得分:5)

由于你没有引用参数,它必须是一个宏:

(defmacro clean (&rest symbols)
  `(progn
     ,@(mapcar (lambda (sym) (list 'setq sym 'nil))
               symbols)))

答案 1 :(得分:5)

与德米特里相似,但产生的代码略少:

(defmacro clean (&rest variables)
  `(setq ,@(loop for var in variables nconc (list var nil))))

(macroexpand '(clean a b c d))
;; (setq a nil b nil c nil d nil)

关于您的其他问题:

  • 简单但耗时的方法是将点移动到你不知道的函数, Ch f Mx {{1这将把函数名放在提示符中(如果它确实是一个Emacs Lisp函数)并显示描述,如果有效的话,还可以显示源代码中的位置。

  • 我会尝试解释,但我不是语言参考:)

    • describe-function - 与函数类似,但不评估参数。读取代码并将其编译为字节码时,将执行宏。他们的主要目标是生成其他代码。
    • defmacro - 是一个创建匿名函数并返回它的宏。
    • lambda - 是一个高阶函数,它将函数连续应用于列表的所有元素,并按照函数应用的顺序将结果收集到列表中。
    • mapcar - 是函数的lambda-list中的一个特殊关键字(即参数的定义),字面意思是该符号后面的标识符是右边所有参数的列表。)
    • &rest是宏中使用的特殊运算符,位于反引号宏内。它指示读者必须对其后面的表达式进行求值,将其视为列表,并且必须将其所有的conses附加到当前正在解析的表单中。