この関数ビルダーは、P.Graham の「ANSI Common Lisp」(110 ページ) で構成を実現するために使用されます。引数は、引用符で囲まれた n>0 関数名です。私はそれを完全には理解していないので、ここにコードを引用し、その下に私の質問を指定します:
(defun compose (&rest fns)
(destructuring-bind (fn1 . rest) (reverse fns)
#'(lambda (&rest args)
(reduce #'(lambda (v f) (funcall f v))
rest
:initial-value (apply fn1 args)))))
構成する引数リストは反転されてアンパックされ、その (最初の) 要素が 'fn1' にバインドされ、残りが 'rest' にバインドされます。最も外側のラムダの本体は reduce: (funcall fi (funcall fi-1 ... ) ) であり、最初のオペランドを復元するためにオペランドの順序が逆になっています。
1) 最も外側のラムダ式の役割は何ですか? つまり、どこから「引数」を取得しますか? destructuring-bind の第一引数に指定したデータ構造ですか?2) 最も内側のラムダはどこから 2 つの引数を取りますか?
コードが何をするかは理解できますが、それでもレキシカルスコープは私にとって少し謎です。どんなコメントでもお待ちしております!前もって感謝します、//マルコ