파일이 컴파일 될 때 매크로가 확장됩니까?


13

사용 컴파일 타임의 모든 단일 인스턴스에서 확장 해야하는 매크로가 있습니다. 코드베이스를 거치지 않고 각 호출을 신중하게 래핑하지 않고 이것을 지정할 수있는 방법이 eval-when-compile있습니까?

답변:


13

바이트 컴파일러가 도달 할 수있는 모든 매크로는 컴파일 중에 확장됩니다. "연결 가능"은 본질적으로 인용되지 않음을 의미합니다.

defuns, defmacros, lambdas 의 본문은 이를 포함하는 소스 파일이 바이트 컴파일 될 때 모두 바이트 컴파일됩니다. 따라서 따옴표 ( ') 안에 있지 않는 한 매크로가 확장됩니다 . 가장 일반적인 실수는 lambdas를 따옴표로 묶는 것입니다. 실제로 s를 인용lambda 해서는 안됩니다 .

매크로가 잘 작성되어 있으면 런타임 성능에 영향을 미치지 않는 매크로의 가장 큰 장점 중 하나입니다. 다른 장점은 물론 그들의 힘과 다양성입니다. 단점은 객체가 아닌 구문을 조작한다는 것이므로 문제의 여지가 많고 예기치 않은 경우가 있으며 불가피한 경우가 있습니다.


7

Malabarba가 이미 설명했듯이 바이트 컴파일 중에 매크로가 확장됩니다. 파일이 컴파일되지 않으면 파일이로드 될 때 매크로가 확장됩니다 (매크로 확장).

그러나 이것에 의존하지 마십시오. 매우 나쁜 스타일입니다. 일반적으로 매크로를 사용하는 코드가 실제로 컴파일되는 것을 기대할 수 없으며 일반적으로 컴파일 하는 동안 가능한 적은 코드를 실행해야합니다 . 특히 다른 방법이없는 경우에만 매크로를 거의 사용 하지 마십시오 . 엄지 손가락의 규칙으로, 이들만을위한 매크로를 사용하는 구문 , 그리고 결코 의미에 대해서는 (또는 기능).

매크로는 누출되는 추상화입니다. 그들의 확장은 컴파일 타임에 대상 코드에 하드 코딩되며 소급하여 변경할 수 없습니다. 대상 코드 는 확장 시간에 매크로 의 특정 구현따라 달라집니다 . 특히 매크로 본문에 사용 된 모든 내부 API 에 따라 다릅니다 .

결과적으로 매크로에 대해 컴파일 된 코드를 깨지 않고이 API 또는 매크로 확장이 의존하는 것을 변경할 수 없습니다.

기능성에 대한 매크로의 자유로운 사용은 의존성 지옥으로가는 길을 열어줍니다 .


매크로를 쓰거나 사용할 때 유의해야 할 점이 있습니다.
Sean Allred

"기능을 위해 매크로를 자유 자재로 사용하면 의존성이 사라질 수 있습니다." 일주일 전까지 package.el에는 완벽하게 합법적 인 매크로 종속성 상황에서 패키지 설치를 완전히 중단시키는 버그가있었습니다.
Malabarba

@ 말라 바바 (Malabarba)
lunaryorn

@lunaryorn 여기 있습니다 . 불쾌한 작은 문제.
Malabarba

1
@lunaryorn 나는 매크로가 위험하다는 것에 동의한다. 그 버그에는 매크로를 전혀 사용하지 않는 다른 (더 가난한) 표현이있었습니다. 또한 함수 종속성에 문제가 발생했습니다.
Malabarba
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.