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


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.