중첩 된 사례 클래스를 출력하는 스칼라 매크로가 있습니다. 프로그래밍 방식 중첩 된 경우 클래스를 구축 구체화를 사용하여 만든 식의 조각을 조립 할 수 있습니다스칼라 매크로에서 동적 시퀀스를 만드는 방법은 무엇입니까?
case class Foo(name: String)
case class Bar(foo: Foo)
def foo(name: String) = {
c.universe reify {
Foo(c.literal(name).splice)
}
}
def bar(foo: Expr[Foo]) = {
c.universe reify {
Bar(foo.splice)
}
}
// output Bar(Foo("MyFoo"))
c.Expr(bar(foo("MyFoo").asInstanceOf[Expr[Foo]]).tree)
상황이 성가신 캐스트에서 떨어져 잘 작동 (내가 그 문제를 해결 할 수있는 방법?). 내가 갇혀있는 곳은 내부 객체의 컬렉션을 필요로하는 일부 사례 클래스를 출력하기를 원할 때입니다. 크기는 처리되는 AST 내에서 마르코가 보는 것에 따라 다릅니다. 내가 foo는 일련의 소요 클래스가있는 경우
그래서 : 나는 서열을 [변환 드릴 수 없습니다
def baz(foos: Seq[Expr[Foo]]): Expr[Baz] = {
val flipped: Expr[Seq[Foo]] = ??? // convert foos from Seq[Expr[Foo]] to Expr[Seq[Foo]]
c.universe reify {
Baz(flipped.splice)
}
}
// now pack any number of Foos into an output Baz as required
c.Expr(baz(Seq(foo("MyFoo1"),foo("MyFoo2"))).tree)
:
case class Baz(foos: Seq[Foo])
나는의 라인을 따라 뭔가를하고 싶습니다 Expr [Foo]]를 Expr [Seq [Foo]]에 삽입하여 가변 개수의 중첩 된 객체를 매크로 출력으로 패킹 할 수 있습니다. 생성자 arg로 사용하기 위해 동적으로 작성한 목록을 어떻게 구체화 할 수 있습니까?
좋은 대답입니다. reify 도우미 함수를 사용하면 매우 잘 작성됩니다. 이들은 소문자로 된 케이스 클래스 컴패니언 객체를 사용하므로인지 오버 헤드가 없습니다. 큰 코드베이스의 CI 빌드에서 일하는 낙원 컴파일러 플러그인을 얻지 않고도 6 명의 헬퍼를 작성하는 것이 빠릅니다. 또한 quasiquotes 구문을 학습해야하므로 입력 AST를 패턴 일치를 사용하여 6 개의 중첩 된 사례 클래스의 풍부한 구조에 매핑하는이 간단한 사용 사례의 경우 과도하다고 생각합니다. 다시 한번 감사드립니다. – simbo1905