【问题标题】:How to pass &rest arguments to another function in emacs lisp?如何将 &rest 参数传递给 emacs lisp 中的另一个函数?
【发布时间】:2014-11-01 15:35:42
【问题描述】:

我的 init.el 中有一个方便的 defun 来做一些日志记录

(defvar log4me::loglevel 5
  "Global loglevel.")

(defun log4me (level logmsg)
  "Log message."
  (interactive)
  (when (>= level log4elisp::loglevel)
    (message logmsg))))

它有点工作,但不知何故我经常这样做

  (log4me somelevel (format "mymessage with %d" 1))

所以我找到了我认为可以像这样使用的 emacs lisp &rest 参数:

(defun log4me (level logmsg &rest formatparams)
  "Log message."
  (interactive)
  (when (<= level log4elisp::loglevel)
    (message (format logmsg formatparams))))

(log4me 3 "Hello %ust!" 1)

导致“格式说明符与参数类型不匹配”错误,因为 formatparams 实际上是 (1) 而不是 1。

有没有一种很好的方法可以将格式参数包含到 log4elisp defun 中,并使它们作为“普通”参数(不是单个列表)到达格式函数调用中?

【问题讨论】:

  • 查看函数APPLY
  • @Rainer Joswig 谢谢!我觉得我需要的只是一个指向文档中正确位置的指针。应用效果很好。您想提供一个简短的答案以便我接受吗?

标签: emacs elisp


【解决方案1】:

你需要的是apply:

(defun log4me (level logmsg &rest formatparams)
  "Log message."
  (interactive)
  (when (<= level log4elisp::loglevel)
    (apply #'message logmsg formatparams)))

【讨论】:

    【解决方案2】:

    apply 非常适合函数,但对于宏等函数对象无效。以下解决方案适用于函数和宏。

    (defun log4me (level logmsg &rest formatparams)
      "Log message."
      (interactive)
      (when (<= level log4elisp::loglevel)
        (eval (append '(message logmsg) formatparams))))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-25
      • 2020-10-03
      • 1970-01-01
      相关资源
      最近更新 更多