2012-04-23 4 views
6

reifyeval을 사용하여 스칼라에서 위생적인 ​​매크로를 작성하는 것이 쉽습니다. 그러나 it's not always possiblereifyeval을 사용합니다.정품이없는 상태에서 위생 보장

매크로를 사용할 수 없으면 매크로가 위생적이라는 것을 보장하는 규칙은 무엇입니까? 나쁜 위생이 균열을 빠져 나가지 않았는지 확인하기 위해 매크로를 테스트 할 수있는 방법이 있습니까?

upd. 2.10.0 이후의 이정표에서 Expr.splice으로 Expr.eval의 이름이 바뀌 었습니다.

+0

[위키 피 디아> 위생적 매크로] (http://en.wikipedia.org/wiki/Hygienic_macro)를 읽는 것이 도움이 될 수 있습니다. 매크로에 대한 많은 경험이 없기 때문에 내가 할 수있는 최선의 방법은 위키 피 디아 정보를 재연하는 것입니다. –

+0

예 - 저는 전 생애의 Lisp 및 C++ 매크로에 익숙합니다. 하지만 하나의 언어로 작동하는 것은 반드시 다른 언어로 직접 포팅하지는 않습니다 :-) –

답변

10

Reify는 Ident와 This 나무와 함께 기호를 저장하기 때문에 위생적입니다.

매크로 확장 결과에 기호가 붙지 않은 경우 (예 : Ident ("x")로 x라는 항목에 대한 참조를 지정하는 경우) 매크로 확장의 후속 형식 검사는 x를 호출 사이트의 범위에 있습니다 (또는 해당 범위에 x가없는 경우 컴파일 오류가 발생합니다).

대조적으로, 매크로 확장에서 해당 식별자에 대한 기호가 있으면 typechecker가 매크로 확장을 다시 해석하려고 시도하지 않고 단순히 가지고있는 것을 사용합니다. 즉, 표현식을 구체화하고 매크로 확장에서 결과를 사용하면 심볼을 호출 사이트로 전달합니다. 모든 기호가 아닙니다. 지역 변수 나 개인/보호 된 것들을 참조하는 것은 불가능하지만, 전역 적으로 접근 가능한 선언에 대한 언급은 지속됩니다.

매크로가 위생적인지 여부를 확인하는 것은 귀하의 idents와 thises에 기호가 첨부되어 있는지 확인하십시오. 수정하거나 손으로 만든 나무에 기호를 수동으로 할당하여이 작업을 수행 할 수 있습니다.

1

reify은 매크로이므로, 매크로가 무엇인지 파악하기 위해 구현을 살펴볼 것입니다.

+0

물론 - 그게 내 다음 행동이 될 것입니다 :-) 나는 "단지"그것을 보게 될 것이라고 확신하지 않습니다 - 구현 꽤 관여하고 따로 따기를 취할 것입니다. 아무도 보이지 않는 것처럼 보이는 것은 손에 규칙이있는 것 같아요. 그렇게했을 때 내가 그들을 붙잡고 여기에 게시 할 수 있는지를 알 것입니다. –