2011-02-25 25 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にすることができます。 applyほかに

+0

ありがとうございました。私はいつもこの問題にぶつかりますが、私は決して覚えたり、何をすべきかを決めることはできません。 –

2

、そこにもあなたはバッククォートの内部でリストをスプライスする,@を使用することが可能なマクロでこれを行う可能性:

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

私もそれをやったことがありますが、マクロと私はまだ十分に快適ではありません。 :-) –

+0

使いやすいので機能が優先されます。 –

+0

@Rainer:マクロを使用する特定の要件がない場合、関数を優先すべきだと知っていますが、この質問のタイトル(拡張および残りのパラメータ)の文脈では、これをバッククォートで特別にサポートしているようです。 –

関連する問題