TL;DR
applyは、第 1 引数で受け取った関数に、第 2 引数で受け取ったシーケンスを引数として渡す。(+ [1 2 3 4])は例外を投げるが、(apply + [1 2 3 4])は(+ 1 2 3 4)に置き換わる。
内容
apply は、第 1 引数で受け取った関数に、第 2 引数で受け取ったシーケンスを引数として渡す。
たとえば、+ 関数は複数の数値を受け取れる。
(+ 1 2 3 4) ; 10しかし、シーケンスを渡すと例外を投げる。
(+ [1 2 3 4])
; java.lang.ClassCastException:
; Cannot cast clojure.lang.PersistentVector to java.lang.Numberapply を使うと、この問題を解決できる。
(apply + [1 2 3 4]) ; 10apply を使うと、上のコードは次のように置き換わる。
(+ 1 2 3 4)シーケンスはベクタに限らず、リストや集合でもよい。
(apply + '(1 2 3 4)) ; 10自作した関数にも適用できる。
(defn my-function [arg1 arg2]
(println "Argument 1:" arg1)
(println "Argument 2:" arg2))(my-function "one" "two")
; Argument 1: one
; Argument 2: two
(my-function ["one" "two"])
; clojure.lang.ArityException:
; Wrong number of args (1) passed to: user/my-function
(apply my-function ["one" "two"])
; Argument 1: one
; Argument 2: two