apply と funcall の違いというか使い分け

はまったのでメモ。
message のような可変長引数 (?) をとる関数に対して、 funcall を使用すると &rest 以下の引数がうまいこと処理されない。

(defun hoge-funcall (string &rest arg)
  (funcall 'message string arg)
  )
(hoge-funcall "aa%s" "bb")		; => "aa (bb)"

リストとして渡されてしまうところに問題があるっぽい。
リストを展開すればいいのかと思ってリスト操作系の関数を調べてもそれらしいものがない。
なので funcall についてマニュアルを調べたら、
http://www.bookshelf.jp/texi/elisp-manual-20-2.5-jp/elisp_12.html#SEC165
直後に apply についての説明が!
説明と例をみてもわからなかったけど、 apply に換えたらうまくいった。

(defun hoge-apply (string &rest arg)
  (apply 'message string arg)
  )
(hoge-apply "aa%s" "bb")		; => "aabb"

使い分けの例として書いてあればいいのにな〜