답변:
바이트 컴파일러가 도달 할 수있는 모든 매크로는 컴파일 중에 확장됩니다. "연결 가능"은 본질적으로 인용되지 않음을 의미합니다.
defun
s, defmacro
s, lambda
s 의 본문은 이를 포함하는 소스 파일이 바이트 컴파일 될 때 모두 바이트 컴파일됩니다. 따라서 따옴표 ( '
) 안에 있지 않는 한 매크로가 확장됩니다 . 가장 일반적인 실수는 lambda
s를 따옴표로 묶는 것입니다. 실제로 s를 인용lambda
해서는 안됩니다 .
매크로가 잘 작성되어 있으면 런타임 성능에 영향을 미치지 않는 매크로의 가장 큰 장점 중 하나입니다. 다른 장점은 물론 그들의 힘과 다양성입니다. 단점은 객체가 아닌 구문을 조작한다는 것이므로 문제의 여지가 많고 예기치 않은 경우가 있으며 불가피한 경우가 있습니다.
Malabarba가 이미 설명했듯이 바이트 컴파일 중에 매크로가 확장됩니다. 파일이 컴파일되지 않으면 파일이로드 될 때 매크로가 확장됩니다 (매크로 확장).
그러나 이것에 의존하지 마십시오. 매우 나쁜 스타일입니다. 일반적으로 매크로를 사용하는 코드가 실제로 컴파일되는 것을 기대할 수 없으며 일반적으로 컴파일 하는 동안 가능한 적은 코드를 실행해야합니다 . 특히 다른 방법이없는 경우에만 매크로를 거의 사용 하지 마십시오 . 엄지 손가락의 규칙으로, 이들만을위한 매크로를 사용하는 구문 , 그리고 결코 의미에 대해서는 (또는 기능).
매크로는 누출되는 추상화입니다. 그들의 확장은 컴파일 타임에 대상 코드에 하드 코딩되며 소급하여 변경할 수 없습니다. 대상 코드 는 확장 시간에 매크로 의 특정 구현 에 따라 달라집니다 . 특히 매크로 본문에 사용 된 모든 내부 API 에 따라 다릅니다 .
결과적으로 매크로에 대해 컴파일 된 코드를 깨지 않고이 API 또는 매크로 확장이 의존하는 것을 변경할 수 없습니다.
기능성에 대한 매크로의 자유로운 사용은 의존성 지옥으로가는 길을 열어줍니다 .