Special-Operator FUNCTION

UP


Special-Operator FUNCTION

Special Operator FUNCTION

構文

function name => function

引数と戻り値

name - 関数名か、ラムダ式
function - 関数オブジェクト

定義

functionの値は、 現在のレキシカルな環境における、 nameの関数値です。

もしnameが関数名のとき、その名前の関数定義は、 fletlabelsmacroletで囲まれた レキシカルな内部に確立されたものがもしあるのであれば、 それが対応します。 そうではないときは、その関数名のグローバルな関数定義が返却されます。

もしnameがラムダ式のとき、レキシカルクロージャーが返却されます。 同じ束縛の集合のクロージャーが複数生成されるような状況では、 それぞれの生成されたクロージャーは eqになるかもしれませんし、ならないかもしれません。

functionフォームが現れるレキシカルな環境において、 対応する関数が存在しないfunction-namefunctionで使用した時はエラーが発生します。 とくに、マクロか特殊フォームを示すシンボルを 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)の略語として使われます。


TOP, Github