再帰呼び出しごとに、kols
パラメーターが になるまでパラメーターを減らしますnil
。再帰を終了する必要がある場合は、終了条件 (つまり、空のリスト) のテストを追加する必要がありkols
ます。nil
(defun foo (funcs order)
(unless (endp order)
(funcall (nth (first order) funcs))
(foo funcs (rest order))))
より読みやすい解決策を提案します (ANSI Common Lisp 標準では実装に末尾呼び出しの最適化を強制しないため、より好ましい解決策です):
(defun foo (funcs order)
(loop for n in order do (funcall (nth n funcs))))
前の例では、戻り値ではなく、副作用のために関数を実行すると仮定しました。
編集 1
Vatine が指摘したように、nth
と リストを使用してコレクションにランダム アクセスを提供するのはパフォーマンスによくないため、関数をリストではなくvector
(1 次元のarray
) に格納する価値があるかもしれません。したがって、 が関数の であると仮定するfuncs
とvector
、関数は次のように定義できます。
(defun foo (funcs order)
(loop for n in order do (funcall (aref funcs n))))
さらに、関数の配列が(用語集のエントリaref
)である場合に置き換えることができます。前者の方が一般的ですが、実装によっては後者の方が高速な場合があります。svref
simple vector
simple vector
いずれかを使用して関数を作成できます
(vector #'func-a #'func-b ...)
また
#(func-a func-b ...)
関数のsimple vector
は、関数を使用して作成することもできますが、キーワード引数が指定さmake-array
れていない場合に限ります または.:adjustable
:fill-pointer
nil