복붙노트

[SCALA] 스칼라 매크로의 정적 반환 형식

SCALA

스칼라 매크로의 정적 반환 형식

나는이 매크로를 가지고 그래서 :

import language.experimental.macros
import scala.reflect.macros.Context

class Foo
class Bar extends Foo { def launchMissiles = "launching" }

object FooExample {
  def foo: Foo = macro foo_impl
  def foo_impl(c: Context): c.Expr[Foo] =
    c.Expr[Foo](c.universe.reify(new Bar).tree)
}

I의 한 내가 foo는이 푸를 반환 할 것을 세 번했다, 그럼에도 불구하고 나는 다음을 수행 할 수 있습니다 (2.10.0-RC3에서) :

scala> FooExample.foo
res0: Bar = Bar@4118f8dd

scala> res0.launchMissiles
res1: String = launching

나도 c.Expr의 유형 매개 변수를 제거하면 같은 일이 발생합니다. 정말 foo는 부르고 누구든지 그들이 줄을 얻고있는 것을 볼 수 있는지 확인하려면, 나는 나무 자체 유형 귀속을 추가해야합니다.

이것은 실제로 꽤 좋은 - 그것은 내가 어떤 종류의 스키마에서 매크로를 가리키고 어휘의 용어를 나타내는 멤버 방법과 몇 가지 어휘 클래스의 익명의 하위 클래스를 만들 수 있습니다 예를 들어 의미하며, 이러한 반환 된 객체에 사용할 수 있습니다.

나는 몇 가지 질문을 그래서 난 그래도하고있어 정확히 이해하고 싶습니다. 첫째, foo는 방법에 반환 형식에 대한 사실은 무엇인가? 그것은 (선택 사항) 문서에 바로 사용할 수 있습니까? 그것은 명확하게 (예를 들어, 나는이 경우 int로 변경할 수 없습니다), 나는 그것을 제거하면 완전히 나는이 같은 오류가 반환 형식을 제한 :

scala> FooExample.foo
<console>:8: error: type mismatch;
 found   : Bar
 required: Nothing
              FooExample.foo
                         ^

그러나 나는 모든으로 변경하고 내가 foo는 호출 할 때 여전히 정적으로 입력 된 줄을 얻을 수 있습니다.

둘째,이 동작 지정된 곳은? 이 문제를 상당히 초등학교 세트 것 같아,하지만 난에 대한 명확한 설명이나 토론을 검색 할 수 없었다.

해결법

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

    1.이 문제는 underspecified하지만이 혼란 나타날 수 있지만, 것입니다. 우리는 매크로 서명에 반환 형식의 역할을 자세히 설명 할 계획하지만 유연성 같은 느낌이 순간에 가지고 좋은 일이다.

    이 문제는 underspecified하지만이 혼란 나타날 수 있지만, 것입니다. 우리는 매크로 서명에 반환 형식의 역할을 자세히 설명 할 계획하지만 유연성 같은 느낌이 순간에 가지고 좋은 일이다.

    또한 항상 일관성 동작은, 예를 들어 매크로는 타입 추론의 중간에 잡힐 때 정전기 서명 (검색 예에서, 즉 푸) 실제 확장하지 유형 사용될 것이다. 형식 유추가 완료 될 때까지 매크로 확장이 의도적으로 지연되기 때문에 이제 (그래서 매크로 구현은 추론 유형을 볼 얻을하지 유형 바르) 그. https://issues.scala-lang.org/browse/SI-6755 : 우린 계획을 곧 다시 방문 할 수 있도록이, 트레이드 오프와 반드시 최선의 하나입니다.

    이 부서에서 또 다른 문제는 암시 매크로입니다. 암시 적 매크로의 반환 형식이 일반적이며 암시 적 가치의 요청 형식에서 추론 할 필요가있을 때, 나쁜 일이 일어날. https://issues.scala-lang.org/browse/SI-5923 :이은 현재 불가능 타입의 태그를 생성하는 매크로를 사용할 수 있습니다.

  2. from https://stackoverflow.com/questions/13669974/static-return-type-of-scala-macros by cc-by-sa and MIT license