一千萬個為什麽

搜索

帶有可選參數的宏,用於檢查是否定義了可選參數?

由於我的懶惰性質,我做了這樣的事情:

(defmacro iλ (x)
  `(lambda() (interactive) ,x))

(defmacro iλd (x y)
     `(lambda() ,x (interactive) ,y))

(global-set-key (kbd "") (iλ (message "hello lambdas")))
(global-set-key (kbd "") (iλd "Func Docu" (message "hello lambda with docus")))

由於我的懶惰性質,我想合並這兩個,但它是在晚上10:16 pm,我似乎無法搞清楚。我想要這樣的東西(偽代碼如下):

 (defmacro iλ (x &optional y)   ;y is optional parameter:
  if x & y are defined:
  `(lambda() ,x (interactive) ,y))
  else if only x is defined:  
  `(lambda() (interactive) ,y)
  )

可以這樣做,如果是這樣的話?

[edit solution] As per Malabarba's answer below, I now use the clever bit of code:

(defmacro iλ (x &rest y) 
    (if (and (stringp x) y) 
        `(lambda() ,x (interactive) ,@y) 
      `(lambda() (interactive) ,x ,@y)))
;Example usage:
(global-set-key (kbd "") (iλ "A message that prints a hello" (message "hello 2")))
(global-set-key (kbd "") (iλ  (message "hello 1")))

最佳答案

這是你想要做的

(defmacro iλ (x &optional y) 
  (if (and (stringp x) y) 
      `(lambda() ,x (interactive) ,y)) 
    `(lambda() (interactive) ,x ,y)))

而且,如果你正在接受建議,這就是我的建議。它應該允許您使用任意數量的表單。

(defmacro iλ (x &rest y) 
  (if (and (stringp x) y) 
      `(lambda() ,x (interactive) ,@y)
    `(lambda() (interactive) ,x ,@y)))

正如@Stefan建議的那樣,如果你使用的是Emacs 25,你可以:

(defmacro iλ (&rest body)
  (let ((x (macroexp-parse-body body)))
    `(lambda() ,@(car x) (interactive)
       ,@(cdr x))))

轉載註明原文: 帶有可選參數的宏,用於檢查是否定義了可選參數?