これまで関数に関数を渡す必要のあるプログラムはあまり書いたことがないので、高階関数はいつも混乱。使いどころを間違えなければシンプルで便利そうなんだけど。
あと、どうもmapcar/apply/funcall/reduceがまぎらわしい。
(mapcar #'- '(2 3)) ;=> (-2 -3) (mapcar #'* '(2 3 4) '(5 6 7)) ;=> (10 18 28) (apply #'+ '(2 3)) ;=> 5 (funcall #'+ 2 3) ;=> 5 (reduce #'+ '(2 3)) ;=> 5
mapcarはリスト内の要素ごとに関数で処理を加えるもの。
applyとfuncallがやることはほぼ同じだけど、引数をリストとして渡すかそのまま書くか、ということ? applyのほうがHyperSpecでの説明文が長いぶんだけ高機能そう。
(apply #'max '(3 4) 5) ;=> エラー (apply #'max 3 '(4 5)) ;=> 5 (apply #'max 5 '(4 3)) ;=> 5
HyperSpecにはreduceは二項演算子しか使えないと書かれていますが、applyよりも高機能な印象。
もっと調べてみよう。