`# '(lambda…`와`(lambda…`) 사이에 차이가 있나요? [duplicate]

Dec 14 2020

에서 실제 커먼 리스프 의 예가 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)

A는 (lambda..)인용 기능 양식에 동행 값은 #'(..)? REPL에서는 그렇게 보이지만 Lisp를 처음 접했기 때문에 무언가를 간과 할 수 있습니다.

답변

4 tfb Dec 14 2020 at 19:03

이 두 가지는 예상대로 동일합니다.

  • #'읽기 매크로이며, #'x로 읽 (function x). 그래서 #'(lambda (...) ...)으로 읽습니다 . CL에서 인수가 함수를 나타내는 특수 연산자는 (function (lambda (...) ...))어디에 있습니까 function?
  • lambda확장 : 매크로로 정의되고 (lambda (...) ...), IS (function (lambda (...) ...): 이전에 동일한 형태.

이는 #'(lambda (...) ...), (lambda (...) ...)(function (lambda (...) ...))모두 CL에서 동일 함을 의미합니다 . 모두 (lambda (...) ...)현재 어휘 환경에 지정된 함수를 나타냅니다 .

사람들이 여전히 #'(lambda (...) ...)버전을 사용하는 데에는 두 가지 이유가 있습니다 .

  • 일관성 – 예를 들어 함수 인 #'foo경우 필요 foo하므로 lambda사례에도 사용하는 것이 더 일관성있는 것으로 보일 수 있습니다 .
  • lambda현재 매크로 정의가있는 CL의 경우가 항상있는 것은 아니므로 원본 CL 사양과 ANSI 표준 사이에 작성되었거나 당시를 기억하는 사람들이 작성한 코드는 #'양식을 사용할 수 있습니다 .