18

私は現在、Paul Graham による ANSI Common Lisp を読んでいますが、ラムダ式の書き方について質問があります。

ラムダ式の前に ? を付ける必要があり#'ますか。REPLでこのようなものを書くとうまくいきます

> ((lambda (x) (+ x 1)) 1)
  2

これもそうでしょう

> (mapcar (lambda (x) (+ x x)) '(1 2 3 4))
  (2 4 6 8)

#'関数を意味することを理解しています。だから私の質問は、それはある種の慣習または推奨される慣行ですか? ラムダの前に#'.

4

1 に答える 1

25

ラムダ式

(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で示される対応する関数オブジェクトを返すことです。関数オブジェクトを値として返します。この特別な演算子を使用すると、グローバル関数とレキシカル関数から関数オブジェクトにアクセスできます。

FUNCTIONCommon Lisp では、値、関数、およびその他のいくつかのものに対して個別の名前空間があるため、演算子が必要です。いわゆるLisp-2またはLisp-nであり、2 つ以上の名前空間があります。

関数形式の関数位置のラムダ式

((lambda (foo) foo) 10)Common Lisp の組み込み構文でサポートされています。ラムダフォームを参照してください。

紛らわしい

これはすべて論理的ですが、紛らわしいです。あなたは一人ではありませんが、実際には大したことではありません。

于 2012-11-03T21:38:43.003 に答える