`# '(lambda…`と `(lambda…`)に違いはありますか?[重複]

Dec 14 2020

で実用的なCommon Lispの例があるREMOVE-IF-NOTラムダとは:

CL-USER> (remove-if-not #'(lambda (x) (evenp x)) '(1 2 3 4 5))
(2 4)

これは次のものと何か違いがありますか?

CL-USER> (remove-if-not (lambda (x) (evenp x)) '(1 2 3 4 5))
(2 4)

(lambda..)引用された機能のフォームに値と一致#'(..)?REPLではそう思われますが、私はLispを初めて使用するので、何かを見落とす可能性があります(そして、私は確かに言い回しを間違えたので、それについても訂正してください)。

回答

4 tfb Dec 14 2020 at 19:03

ご想像のとおり、これら2つのことは同じです。

  • #'は読み取りマクロであり、#'xとして読み取られ(function x)ます。したがって、#'(lambda (...) ...)はとして読み取られます(function (lambda (...) ...))。ここfunctionで、はCLの特別な演算子であり、その引数は関数を示します。
  • lambdaはマクロとして定義されます:の展開(lambda (...) ...)(function (lambda (...) ...):前のものと同じ形式です。

これは#'(lambda (...) ...)(lambda (...) ...)(function (lambda (...) ...))すべてがCLで同じものであることを意味します。これらはすべて(lambda (...) ...)、現在の字句環境で指定された関数を示します。

人々がまだ#'(lambda (...) ...)バージョンを使用するかもしれない2つの理由があります:

  • 一貫性–たとえば#'foofooが関数の場合は必要なので、lambdaケースにもそれを使用する方が一貫性があると見なされる場合があります。
  • lambda現在のマクロ定義を持つCLの場合は必ずしもそうではなかったため、元のCL仕様とANSI規格の間で記述されたコード、または当時を覚えている人々によって記述されたコードは、この#'フォームを使用できます。