Function FUNCTION-LAMBDA-EXPRESSION
function-lambda-expression function
=> lambda-expression, closure-p, name
function - 関数
lambda-expression - ラムダ式か、nil
closure-p - generalized-boolean
name - オブジェクト
下記に示すような、functionの情報を返却します。
第一返却値であるlambda-expressionは、 functionが定義されたラムダ式か、 もし情報が利用できないときはnilです。 ラムダ式は何らかの方法で前処理されているかもしれませんが、 しかしcompileやfunctionの引数としては 適切のままであるべきです。 実装は、どんなfunctionのlambda-expressionでも nilを返却するのは正当です。
第二返却値のclosure-pは、 functionの定義がnullのレキシカルな環境で囲まれていたか、 あるいはfunctionの定義が何らかの非nullのレキシカルな環境で囲まれた 非nilの環境下であれば、 nilが返却されます (注釈:非nullのレキシカルな環境とは、 グローバル環境から何の追加情報もないレキシカルな環境のことです)。 実装は、どんなfunctionのclosure-pでも、 trueを返却するのは正当です。
第三返却値nameは、関数の名前です。 名前はデバッグ時にのみ使われ、 それは、例えばdefunやfunctionの 名前として使われるのに有効である必要はありません。 慣例として、nilは functionが名前を持たないことを意味します。 実装は、どんなfunctionのnameでも、 nilを返却するのは正当です。
下記の例はいくつか可能性のある返却値を示していますが、 しかし全てを網羅することを意図してはいません。
(function-lambda-expression #'(lambda (x) x))
=> NIL, false, NIL
OR=> NIL, true, NIL
OR=> (LAMBDA (X) X), true, NIL
OR=> (LAMBDA (X) X), false, NIL
(function-lambda-expression
(funcall #'(lambda () #'(lambda (x) x))))
=> NIL, false, NIL
OR=> NIL, true, NIL
OR=> (LAMBDA (X) X), true, NIL
OR=> (LAMBDA (X) X), false, NIL
(function-lambda-expression
(funcall #'(lambda (x) #'(lambda () x)) nil))
=> NIL, true, NIL
OR=> (LAMBDA () X), true, NIL
NOT=> NIL, false, NIL
NOT=> (LAMBDA () X), false, NIL
(flet ((foo (x) x))
(setf (symbol-function 'bar) #'foo)
(function-lambda-expression #'bar))
=> NIL, false, NIL
OR=> NIL, true, NIL
OR=> (LAMBDA (X) (BLOCK FOO X)), true, NIL
OR=> (LAMBDA (X) (BLOCK FOO X)), false, FOO
OR=> (SI::BLOCK-LAMBDA FOO (X) X), false, FOO
(defun foo ()
(flet ((bar (x) x))
#'bar))
(function-lambda-expression (foo))
=> NIL, false, NIL
OR=> NIL, true, NIL
OR=> (LAMBDA (X) (BLOCK BAR X)), true, NIL
OR=> (LAMBDA (X) (BLOCK BAR X)), true, (:INTERNAL FOO 0 BAR)
OR=> (LAMBDA (X) (BLOCK BAR X)), false, "BAR in FOO"なし。
なし。
なし。
なし。
実装は全ての場合において、自由にnil, true, nilを返却することができますが、 compileかevalの呼び出しによって引数が作成された場合 (コンパイルされたファイルのロードによって生成されたものとは反対に)は、 第一返却値にラムダ式を返却することが推奨されています。