Function APPLY
apply
function &rest args+ => result*
function - 関数指定子
args - 広げられる引数リスト指定子
result - functionの返却値
functionをargsで実行します。
functionが&rest
経由で引数を受け取るとき、 実装はrest
パラメーターに、 apply
の最後の引数で共有されている構造のオブジェクトを、 束縛することが許されています (ただし要求されているわけではありません)。 関数はそれがapply
経由か、 あるいはapply
の最後の引数が定数で呼び出されかどうかを 検出できないため、 適合するプログラムは、 rest
のリスト構造が新しいコンスであることに頼ってはいけませんし、 またそのリスト構造を修正してもいけません。
setq f '+) => +
(apply f '(1 2)) => 3
(setq f #'-) => #<FUNCTION ->
(apply f '(1 2)) => -1
(apply #'max 3 5 '(2 7 3)) => 7
(apply 'cons '((+ 2 3) 4)) => ((+ 2 3) . 4)
(apply #'+ '()) => 0
(
defparameter *some-list* '(a b c))
(defun strange-test (&rest x) (eq x *some-list*))
(apply #'strange-test *some-list*) => implementation-dependent
(
defun bad-boy (&rest x) (rplacd x 'y))
(
(bad-boy 'a 'b 'c) has undefined consequences.apply #'bad-boy *some-list*) has undefined consequences.
(defun foo (size &rest keys &key double &allow-other-keys)
(let ((v (apply #'make-array size :allow-other-keys t keys)))
(if double (concatenate (type-of v) v v) v)))
(4 :initial-contents '(a b c d) :double t)
(foo => #(A B C D A B C D)
なし。
なし。
funcall
, fdefinition
, function
, 3.1. 評価, 5.1.2.5. APPLYのplace
フォーム
なし。