関数とは何ですか?
これが発生する理由を理解するには、関数とは何かを知る必要があります。lispフォームを評価するとき(myfunc arg1 arg2 ...)
、emacsは最初に何であるかをチェックしmyfunc
ます。それが関数である場合、EmacsはすべてのLispフォームを評価しarg1
、arg2
など、その関数を呼び出し、myfunc
引数として結果のLispオブジェクトで。
前述のように、and
は関数ではなく、特殊な形式であるため、必要に応じて引数を評価できます。以前にコメントで述べたように、フォーム(and nil (drop 'bomb))
は(drop 'bomb)
評価されないので安全です。
一方、(apply #'and (list nil (drop 'bomb)))
あるため、安全ではないapply
です関数はEmacsの最初の評価させ、#'and
(結果がシンボルである)、そして評価さ(list nil (drop 'bomb))
:あなたは次に何が起こるかを推測して、再度、関数呼び出しで、nil
その後、評価され(drop 'bomb)
、評価されます。
なぜapply
文句を言うのですか?
apply
特殊なフォーム(またはマクロ)で使用しようとしても意味がありません。特殊なフォームは特殊な動作をすることができないため、エラーをスローします。
and
関数ではなく特殊な形式です。