Special Operator FUNCTION
function name => function
name - 関数名か、ラムダ式
function - 関数オブジェクト
functionの値は、 現在のレキシカルな環境における、 nameの関数値です。
もしnameが関数名のとき、その名前の関数定義は、 flet、labels、macroletで囲まれた レキシカルな内部に確立されたものがもしあるのであれば、 それが対応します。 そうではないときは、その関数名のグローバルな関数定義が返却されます。
もしnameがラムダ式のとき、レキシカルクロージャーが返却されます。 同じ束縛の集合のクロージャーが複数生成されるような状況では、 それぞれの生成されたクロージャーは eqになるかもしれませんし、ならないかもしれません。
functionフォームが現れるレキシカルな環境において、 対応する関数が存在しないfunction-nameを functionで使用した時はエラーが発生します。 とくに、マクロか特殊フォームを示すシンボルを functionで使用した時はエラーになります。 実装は、パフォーマンスの理由からこのエラーを通知しないことを選択できますが、 しかし使いやすいからと言ってエラー通知を怠るように定義することは許されません。
(defun adder (x) (function (lambda (y) (+ x y))))(adder 3)の結果は、3と引数を加算する関数です。
(setq add3 (adder 3))
(funcall add3 5) => 8これが動作する理由は、 functionがラムダ式のクロージャーを生成しているからであり、 制御が関数addrから返却された後でさえ、 変数xの値3を参照することができます。
なし。
なし。
なし。
defun, fdefinition, flet, labels, symbol-function, 3.1.2.1.1. フォームとしてのシンボル, 2.4.8.2. シャープサイン シングルクォート, 22.1.3.13. 他のオブジェクトの印字
#'nameという表記が、(function name)の略語として使われます。