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

Function Emacs定义了一个将参数设置为nil的函数,function,emacs,lisp,Function,Emacs,Lisp,我想创建一个nil函数,它接受任意数量的符号并将它们全部设置为nil (defun clean (as many args as given by user) (setq each-arg nil) ) (clean x y z) 如何“干净地”执行此操作?因为您没有引用参数,所以它必须是一个宏: (defmacro clean (&rest symbols) `(progn ,@(mapcar (lambda (sym) (list 'setq sym 'nil)

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

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

(clean x y z)

如何“干净地”执行此操作?

因为您没有引用参数,所以它必须是一个宏:

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

与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-x
    description function
    这将在提示符中显示函数名(如果它确实是一个Emacs Lisp函数),并在源代码中显示描述和位置(如果可用)

  • 我会尽力解释,但我不是语言参考人:)

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

很多对我来说都是新的,
defmacro
lambda
mapcar
&rest
,@
。你能不能补充一些解释,比如你为什么要用这些东西?我以前读过每一本,但它们都很复杂。以这个为例,我认为其他一些人真的会从解释中受益(至少我真的会!)。如果有人想帮助你,这很酷。我的观点是,最好是自力更生,学习这些东西。如果您在从手册中学习时遇到困难,请将文档错误归档,以便您所在职位的其他人将来可以更轻松地学习。@Duality我想您可能需要重新阅读本章。第一部分(“简单宏”)中的示例与此问题非常相似。另请参见.Or:(defmacro clean(&rest symbols)`(mapc(lambda(sy)(set sy nil)),symbols)),我认为您不能“干净地”执行此操作,因为此操作从根本上说是丑陋的。如果你给我们展示一些你认为你想要的例子,我们将向你展示如何做得更好。好吧,我实际上想要这里描述的行为…谢谢,这真的很有帮助!我知道并经常使用
C-hf
,但其中一些(如
mapc
或其他)非常复杂,我没有“理解”它们。
M-x elisp index search
是你的朋友。(如果这还不够,那么
I
键将为您提供给定搜索词的完整索引点击列表。)