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