[英]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.