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.Number

apply を使うと、この問題を解決できる。

(apply + [1 2 3 4]) ; 10

apply を使うと、上のコードは次のように置き換わる。

(+ 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

キーワード