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