0

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

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

(clean x y z)

如何“干净”地做到这一点?

4

2 回答 2

5

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

(defmacro clean (&rest symbols)
  `(progn
     ,@(mapcar (lambda (sym) (list 'setq sym 'nil))
               symbols)))
于 2013-01-12T10:35:31.473 回答
5

与 Dmitry 类似的想法,但生成的代码略少:

(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)

关于你的其他问题:

  • 简单但耗时的了解方法是将点移至您不知道的函数,C-h f或者M-xdescribe-function这会将函数名称放在提示符中(如果它确实是 Emacs Lisp 函数)并显示描述,如果可用源代码中的位置。

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

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