% Special-Operator FUNCTION
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)の略語として使われます。