Lisp を使い始めてまだ間もないので、apply っていつ使うの?てか apply って何?という疑問があり、本やWebで説明を読んでも「ふーん、funcall と比べると引数の処理が違うのか〜」とは分かるんだけど、今一使いどころが分からなかった。
 
小難しい説明はいいからどうやって使うか見せてよ!って時に頼りになるのが Lisp エイリアンの本(実は僕が最初に買った Lisp 本がこれ)。
 

 
最初にまとめちゃうと、apply は関数に渡したい引数が、本来であればバラバラでほしいのにリストにまとめられた形できちゃった時に便利。
 
エイリアン本に載ってるこの例が一番わかり易い。
 

 
(apply #'append '((1 2) (3 4)))
-> (1 2 3 4)
 

 
append はそもそも複数のリストをくっつけるものだから、本来であれば
 

 
(append '(1 2) '(3 4))
-> (1 2 3 4)
 

 
こうしたいんだけど、都合上、例えば append を包む関数が &rest で可変数のリストを受け付けちゃってて、関数の中で参照するときは複数のリストがひとつのリストにまとまっちゃってるとかいう場合に使える。
 
もう一つ、こちらのブログ を参考にさせてもらったんだけど、これも &rest 絡みで、最初のいくつかの引数は固定で欲しいけど、それ以降は可変という場合にも便利かも。
 

 
;; &rest args が関数の定義の中では
;; ひとつのリストになるから、
;; 受け取った引数全部をフラットな
;; リストにしたかったら
(defun foo/apply (1st 2nd &rest args) 
 (apply #'list 1st 2nd args)) 
 
(foo/apply 1 2 3 4 5)
-> (1 2 3 4 5)
 
 
;; これ、apply を使わずに単に list だけだと・・・
(defun foo/list (1st 2nd &rest args) 
 (list 1st 2nd args))
 
;; こうなっちゃう
(foo/list 1 2 3 4 5)
-> (1 2 (3 4 5))
 

 
すげー簡単に言っちゃうと、「リストをバラす時には apply 」って覚え方でも差し支えない気がする。
 
 
 

§1585 · Posted By · 5月 9, 2014 · Development · Tags: , , , · [Print]