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