簡體   English   中英

如何將 &rest 參數傳遞給 emacs lisp 中的另一個函數?

[英]How to pass &rest arguments to another function in emacs lisp?

我在 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

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

apply對函數來說是完美的,但對像宏這樣的函數對象無效。 以下解決方案適用於函數和宏。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM