2014-07-09 9 views
1

스칼라 매크로에서 x -> y 연산의 트리 패턴을 일치시키고 싶습니다. Scala 2.10.4 (with Macro Paradise) 및 Scala 2.11.x에 대해 교차 컴파일입니다. 다음 패턴을 시도했지만 아무도 작동하지 않았습니다.스칼라 매크로에서 화살표 연결 트리 (`x-> y`)와 일치하는 방법은 무엇입니까?

arrowTree match { 
    case q"$x -> $y"           => ??? 
    case q"scala.Predef.ArrowAssoc[${_}, ${_}]($x).->$y"  => ??? 
    case q"_root_.scala.Predef.ArrowAssoc[${_}, ${_}]($x).->$y" => ??? 
    case q"_root_.scala.Predef.ArrowAssoc($x).->$y"    => ??? 
} 

2.10.4 및 2.11.x 모두에 대해이 패턴이 적용되는 패턴은 무엇입니까?

+0

무엇이'q'입니까? 문자열 보간을 위해서's','f','raw' 만 보았습니다 ... 그래서'q'가 무엇입니까? –

+0

quasiquotes, 그 문자열에서 나무를 만드는 데 사용 – monkjack

+1

'q "$ x -> $ y"'에 대해? 당신은 당신의 quasiquotes에 어떤 변수도 지정하지 않고 있으며 틀립니다. – wedens

답변

2

완벽한 세계에서 가장 먼저 일치하는 것을 기대할 수 있지만 그렇게 간단하지는 않습니다.

foo -> bar을 스칼라로 쓸 때마다 foo.->(bar)과 같은 메서드를 효과적으로 호출합니다. typechecker가 ->이라는 메서드를 찾으려고하면 해당 메서드가 실패하고 foo에 해당 메서드를 추가 할 수있는 암시 적 요소를 찾기 시작하며 대개 원래 표현식을 scala.this.Predef.ArrowAssoc[Int](1).->[Int](2)으로 바꾸는 Predef.ArrowAssoc을 찾습니다.

는 패턴를 사용할 수 있습니다이 일치하려면
case q"scala.this.Predef.ArrowAssoc[$_]($foo).->[$_]($bar)" => 

여기에 우리는 우리가 순간에 그 신경 쓰지 않는 타입 매개 변수 위치에 와일드 카드를 넣습니다. 암시가 후와 다르게 이름 때문에

2.10에 패턴이 약간 다른 것 : 여기

case q"scala.this.Predef.any2ArrowAssoc[${_}]($foo).->[${_}]($bar)" => 

또 다른 차이점은 와일드 카드 주위에 중괄호를 사용할 필요가있다. 문자열 보간 자의 $_ 구문은 2.10에서 지원되지 않습니다.