복붙노트

[SCALA] 스칼라 매크로 : 차이점은 무엇입니까 (일명 타입 체크)이 지정되지 않은 나무 입력

SCALA

스칼라 매크로 : 차이점은 무엇입니까 (일명 타입 체크)이 지정되지 않은 나무 입력

나는 그들이 멋진있어, 스칼라 매크로 시작 해요,하지만 난 입력 (일명 타입 체크)와 유형이 지정되지 않은 나무의 차이로 실행 해요.

A는 어떤 이유로 트리 타입 체크와 함께 예를 들어, c.eval 호출 할 수 없습니다. 나는이 스칼라 매크로 문서에서 '타입 체크'에 대한 문서를 찾을 수 없습니다 (그들은 아직도 노력하고 내가 아는을,이 요구가 어떤 일을 추가 할 수 있다는 것을 수 있습니다).

트리가 타입 체크되는 것이 무엇을 의미합니까? 왜 분명히 c.eval 캔 타입 체크 나무 (역이 나에게 더 나을)을 처리하지 않는 것이 그들이 그렇게 다르다.

나는이 101 아마 컴파일러 것 같아요,하지만 난 그 과정을하지 않았다 :( 기사에 대한 모든 설명이나 포인터 / documenation 주시면 감사하겠습니다!

해결법

  1. ==============================

    1.이론적 인 부분

    이론적 인 부분

    이것은 우리가 2.10에서 컴파일 타임 / 런타임 반사 내부 컴파일러 데이터 구조를 노출되면 공개 API로 누출 시작 scalac의 건축 특색이다.

    아주 거칠게 말하자면, scalac의 프론트 엔드는 파서와 타이 퍼로 구성되어, 모두 자신의 결과로 나무와 생산 나무하는 일. 이 나무의 특성은 타이 퍼에 의해 생산 된 나무가 기인 반면 파서에 의해 생산 된 나무 (NoSymbol 그들의 기호 필드 세트와 null로 자신의 TPE 필드 세트를 가진) 비 기여한다는 사실에서 오는 매우 다르다 그러나.

    그것은 바로, 단지 기호와 TPE 때문에 지금 당신이 만들 수있는 차이가 궁금 할 것이다? 그러나 scalac에 그냥 그 이상입니다. 그 일을하기 위해, 타이 퍼는 일부 합성 나무를 일부 원래 나무를 파괴하고 생산, 그것의 처리를하는 AST의 구조를 변경합니다. 불행하게도, 때로는 이러한 변환은 하나 typechecks 나무 경우, 다음 할당 된 모든 속성을 삭제하고 그 결과 나무는 더 이상 (https://issues.scala-lang.org/browse/ 이해하지 않을 것을하는 수단, 돌이킬 SI-5464).

    하나 지울 이유 무사는하지만, 타입 체크 나무의 속성 (또는 scalac 용어로, resetLocalAttrs 또는 resetAllAttrs 같이 재설정)? 음,이 필요성이 또 다른 구현 세부에서 유래 - 기호와 소유자 체인. 내가 스칼라 - 내부에 그것에 대해 몇 가지 세부 사항을 서면으로 작성했습니다 불과 몇 일 전 : https://groups.google.com/d/msg/scala-internals/rIyJ4yHdPDU/qS-7DreEbCwJ하지만, 간단히 말해서에서 할 수 있습니다 ' t의 유형 체킹, 일부 어휘 맥락에서 나무와 단순히 다른 어휘 문맥에서 사용 (즉, 본질적으로 c.eval에 필요한 기능).

    그래서, scalac 나무 관리에있는 예술의 상태까지를 요약합니다 :

    당신이 볼 수 그래서, 우리의 나무 스칼라에서 메타 프로그래밍으로 복잡성의 큰 거래를 제공하는 매우 변덕이다.

    그러나 좋은 소식은 이러한 복잡성이 복잡성은 부수적 인 컴파일러 (101) 모두에서 발생한 몇 가지 근본적인 좋은 이유에 의해 결정되지 않는 것입니다, 우리는 모두 사라 졌어요 때까지 단계적으로 축출 할 계획입니다. https://groups.google.com/forum/#!topic/scala-internals/TtCTPlj_qcQ이 방향으로 첫 번째 단계는 것입니다 (또한 몇 일 전에 게시). 또한 올해 도착할 수있는 다른 케이크에 대한 계속 지켜봐 주시기 바랍니다!

    실제 일부

    아무것도 작품, 나는 보통 사람이 매크로를 사용할 때 이런 종류의 물건에 대해 알 필요하지 않습니다 싶을 때 한 후 철저하게 모든 세부 사항을 정교화하고 신비로운 사건을 언급하여 무서워. 수시로 모두 지정되지 않은 나무 (수동 constructured하는 AST, quasiquotes) 및 입력 나무 잘 (매크로 인수) 작업.

    scalac가 특정 트리 맛을 원할 때 경우에,이 중 하나를 당신의 얼굴에 충돌 때로는 c.eval처럼 말할 또는 것 (RefChecks, LambdaLift 및 GenICode 충돌 나무가 매크로 확장 중에 섞여있어 것을 큰 지표는 - 이러한 경우는 resetLocalAttrs를 사용에 등)에 기재된 https://groups.google.com/forum/#!msg/scala-internals/rIyJ4yHdPDU/qS-7DreEbCwJ. 이 문제를 해결하는 것은 내 최우선 과제이며, 지금은 그것에 일하고 있어요. 이 때문에 수정 2.11.0로 만들 것,이 대답은 곧 무용지물이 될 것이라고 발생할 수 :

  2. from https://stackoverflow.com/questions/20936509/scala-macros-what-is-the-difference-between-typed-aka-typechecked-an-untyped by cc-by-sa and MIT license