Emacs 使用&rest一次递增多个变量?

Emacs 使用&rest一次递增多个变量?,emacs,elisp,Emacs,Elisp,我想创建一个函数,允许: incf vara varb varc vard 而不是 印加瓦拉 incf varb incf varc incf vard 我不明白的是如何能够发送更多的参数,如何在函数中定义参数 德芬公司和rest公司 互动的 mapcar’incf arg 这会增加参数,但当然不会将它们保存回变量中 如何进行此操作?它应该可以工作: (require 'cl) (setq a 1) (setq b 2) (defun inc (&rest arg) (inte

我想创建一个函数,允许:

incf vara varb varc vard

而不是

印加瓦拉 incf varb incf varc incf vard

我不明白的是如何能够发送更多的参数,如何在函数中定义参数

德芬公司和rest公司 互动的 mapcar’incf arg

这会增加参数,但当然不会将它们保存回变量中

如何进行此操作?

它应该可以工作:

(require 'cl)

(setq a 1)
(setq b 2)

(defun inc (&rest arg)
  (interactive)
  (mapc (lambda (x) (incf (symbol-value x))) arg))

(inc 'a 'b)

(message "%s %s" a b) => (2 3)
您必须引用每个参数,否则inc a b在执行inc之前变为inc 1 2。

它应该工作:

(require 'cl)

(setq a 1)
(setq b 2)

(defun inc (&rest arg)
  (interactive)
  (mapc (lambda (x) (incf (symbol-value x))) arg))

(inc 'a 'b)

(message "%s %s" a b) => (2 3)

您必须引用每个参数,否则inc a b在执行inc之前变为inc 1 2。

如果您希望能够将此表单写为my incf a b c而不引用变量名a、b和c,请将其设置为宏而不是函数:

(defmacro incf+ (&rest vars)
  `(progn
     ,@(mapcar (lambda (var) `(incf ,var)) vars)))
使用宏扩展检查它是否扩展为正确的代码:

由于Emacs Lisp中的变量在默认情况下具有动态作用域,因此使用以引用的变量名作为参数的函数可以完成几乎相同的任务。但是宏版本的优点是,由于它在被调用的地方扩展为代码,因此它也可以处理词汇绑定的变量。符号值仅适用于动态绑定的变量

您可以通过将以下内容放入一个文件并将其加载到Emacs 24或更高版本中来测试这一点:

;; -*- lexical-binding: t -*-

(defun incf+fun (&rest vars) 
  (mapc #'(lambda (var) (incf (symbol-value var))) vars))

(defun incf-macro-test ()
  (let ((a 5) (b 7) (c 11))
    (incf+ a b c)
    (list a b c)))

(defun incf-function-test ()
  (let ((a 5) (b 7) (c 11))
    (incf+fun 'a 'b 'c)
    (list a b c)))

评估incf宏测试将返回6 8 12,但incf函数测试将使用无效变量a错误进入调试器

如果您希望能够在不引用变量名a、b和c的情况下将此表单写成my incf a b c,请将其设置为宏而不是函数:

(defmacro incf+ (&rest vars)
  `(progn
     ,@(mapcar (lambda (var) `(incf ,var)) vars)))
使用宏扩展检查它是否扩展为正确的代码:

由于Emacs Lisp中的变量在默认情况下具有动态作用域,因此使用以引用的变量名作为参数的函数可以完成几乎相同的任务。但是宏版本的优点是,由于它在被调用的地方扩展为代码,因此它也可以处理词汇绑定的变量。符号值仅适用于动态绑定的变量

您可以通过将以下内容放入一个文件并将其加载到Emacs 24或更高版本中来测试这一点:

;; -*- lexical-binding: t -*-

(defun incf+fun (&rest vars) 
  (mapc #'(lambda (var) (incf (symbol-value var))) vars))

(defun incf-macro-test ()
  (let ((a 5) (b 7) (c 11))
    (incf+ a b c)
    (list a b c)))

(defun incf-function-test ()
  (let ((a 5) (b 7) (c 11))
    (incf+fun 'a 'b 'c)
    (list a b c)))

评估incf宏测试将返回6 8 12,但incf函数测试将使用无效变量a错误进入调试器

这是您建议的方法吗?使用&rest?&rest可以让您不只是指出一些参数。对于其他人来说,这就像是德芬公司的a b。。或者defun inc a b c…我建议您使用dolist而不是mapc。它的效率稍高一些,字节编译器也不知道如何为您进行转换。这是您建议的方法吗,使用&rest?&rest可以让您不只是指出一些参数。对于其他人来说,这就像是德芬公司的a b。。或者defun inc a b c…我建议您使用dolist而不是mapc。它的效率稍微高一点,而且字节编译器不知道如何为您进行转换。不到两周前,您或多或少地问了同样的问题。不到两周前,你或多或少地问了这个问题。