"type"키워드로 정의 된 유형을 사용하는 매크로를 사용하고 싶습니다. 그것을 어떻게 참조 할 수 있습니까? 내가 예제에서 컴파일러 오류를 표시 한유형 프로그래밍을 스칼라 매크로와 결합하는 방법
import scala.reflect.macros.Context
import scala.language.experimental.macros
trait Demo6 {
type T
def add(param: Any): T = macro Demo6.addImpl[T]
def fullAdd(param: Any, toStringBasedOnAST: String): T = {
doesSomeThing_and_returnsSomething_OfTypeT
}
def doesSomeThing_and_returnsSomething_OfTypeT: T //just to allow compilation
}
object Demo6 {
def addImpl[T: c.WeakTypeTag](c: Context)(param: c.Expr[Any]): c.Expr[T] = {
import c.universe._
reify { (c.Expr[Demo6](c.prefix.tree)).splice.fullAdd(param.splice,
c.literal(show(param.tree)).splice) }
// ^- type mismatch; found : org.autotdd.scalamacros.Demo6#T
// required: T
}
}
내 시작 코드입니다. 그것은 무슨 일이 일어나고 있는지 꽤 명확 : 키워드에 의해 정의 된 타입 T가하지 내가 전달하고있는 T 형과 동일 내가 해봤
것
아직에 많은 문서가 아닌 . scala-macros. http://docs.scala-lang.org/overviews/macros/overview.html의 섹션은 지금까지 나에게 도움이되었지만 예제에서는 클래스 수준과 메서드 수준을 일반적으로 사용합니다. Expecty와 macrocosm에 대한 코드를 찾아 보았습니다.이 코드는 문서에서 언급 된 프로젝트이지만 이런 코드는 찾을 수 없습니다.
'T'에 type 태그를 사용해야합니까? 그렇지 않다면,'addImpl'을 위해서'T' 매개 변수조차 필요하지 않습니다. 당신은'Typed'와'TypeName ("T")'를 사용할 수 있어야합니다. –