ラムダ式
(lambda ...)
フォームや関数呼び出しの先頭など、特定の場所でのみラムダ式と見なされます。function
ラムダ式は評価されません。
(function ; special operator FUNCTION
(lambda () 'foobar)) ; <- this is a lambda expression
( ; a function call
(lambda (foo) foo) ; <- this is a lambda expression
'bar ; argument
)
しかし(lambda ...)
、これはマクロ形式であり、ラムダ式ではありません:
(funcall ; calling a function via funcall
(lambda (foo) foo) ; this is not a lambda expressions, but the macro lambda
; as all arguments to FUNCALL it will be
; macro expanded and evaluated
; it expands to (function (lambda (foo) foo))
'bar) ; argument
LAMBDA マクロ
LAMBDAはマクロです。に展開(lambda ...)
されます。(function (lambda ...))
これは と同等です#'(lambda ...))
。
CL-USER > (macroexpand '(lambda (foo) foo))
(FUNCTION (LAMBDA (FOO) FOO))
マクロは、書き込み/読み取りを少し節約します。それだけです。Common Lisp (CLtL1) の最初のバージョンには、LAMBDA
マクロはありませんでした。後で追加され、現在ANSI Common Lispの一部となっています。
FUNCTION 特殊演算子
FUNCTIONは特別な演算子です。関数名またはラムダ式が必要です。したがって、名前またはラムダ式は評価されません。実際、ラムダ式はまったく評価できません。内部FUNCTION
では、ラムダ式はマクロ形式ではないため、再度展開されることはありません。の目的は、名前またはラムダ式FUNCTION
で示される対応する関数オブジェクトを返すことです。関数オブジェクトを値として返します。この特別な演算子を使用すると、グローバル関数とレキシカル関数から関数オブジェクトにアクセスできます。
FUNCTION
Common Lisp では、値、関数、およびその他のいくつかのものに対して個別の名前空間があるため、演算子が必要です。いわゆるLisp-2またはLisp-nであり、2 つ以上の名前空間があります。
関数形式の関数位置のラムダ式
((lambda (foo) foo) 10)
Common Lisp の組み込み構文でサポートされています。ラムダフォームを参照してください。
紛らわしい
これはすべて論理的ですが、紛らわしいです。あなたは一人ではありませんが、実際には大したことではありません。