2011-02-25 46 views
7

假设我总是厌倦了编写“format t ...”,并且想要少一些击键次数。在Common Lisp中扩展&rest参数

所以我写这篇文章:。

(defun puts (fstring &rest vars) 
    (format t fstring vars)) 

(puts "~a ~a" 1 2) 

;; error message results, because vars became (1 2) 

现在,vars已被改造成任何PARAMS我通过列表它需要“扩展”出来到值的列表。

解决此问题的典型解决方案是什么?

回答

11

您可以使用apply(apply #'format t fstring vars)vars扩展为format的单独参数。

+0

谢谢。我总是遇到这个问题,但我永远不会记住或弄清楚该怎么做。 –

2

此外apply,也有可能与在其中您可以使用,@拼接反引号里面列出了宏做到这一点:

(defmacro puts (fstring &rest vars) 
    `(format t ,fstring ,@vars)) 
+1

我也这样做了,但宏和我还不够舒服。 :-) –

+0

功能是首选,因为它们更易于使用。 –

+0

@Rainer:我知道如果没有使用宏的具体要求,函数应该是首选,但在这个问题的标题(扩展&休息参数)的上下文中,似乎值得注意的是,在反引号中对此有特别的支持。 –