2013-06-26 4 views
2

setter 및 getter 메서드를 매크로로 구현하는 데 문제가 있습니다. 예를 들면 다음과 같습니다.매크로로 스칼라 getter/setter

Welcome to Scala version 2.10.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_25). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

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

object ValueMacro { 
    def getValueImpl[T](c: Context): c.Expr[T] = { 
    import c.universe._ 
    c.Expr[T](Apply(Select(c.prefix.tree, newTermName("getVal")), Nil)) 
    } 
    def setValueImpl[T](c: Context)(value: c.Expr[T]): c.Expr[Unit] = { 
    import c.universe._ 
    c.Expr[Unit](Apply(Select(c.prefix.tree, newTermName("setVal")), List(value.tree))) 
    } 
} 

object Module { 
    def setVal(value: String): Unit = ??? 
    def getVal(): String = ??? 

    def value: String = macro ValueMacro.getValueImpl[String] 
    def value_=(value: String): Unit = macro ValueMacro.setValueImpl[String] 
} 


// Exiting paste mode, now interpreting. 

import scala.reflect.macros.Context 
import scala.language.experimental.macros 
defined module ValueMacro 
defined module Module 

scala> Module.value 
scala.NotImplementedError: an implementation is missing 
    at scala.Predef$.$qmark$qmark$qmark(Predef.scala:252) 
    ... 
    at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala) 


scala> Module.value = "???" 
<console>:11: error: reassignment to val 
     Module.value = "???" 
       ^

게터는 작동하지만 설정하지는 않습니다. 이상한 오류가 발생합니다.

우연히 나는 그런 것을 알아 차렸습니다. GETVAL()는 다음 모듈에 존재하지 않을 경우

scala> Module.value 
<console>:15: error: value getVal is not a member of object Module 
       Module.value 
        ^

scala> Module.value = "???" 
<console>:17: error: value getVal is not a member of object Module 
val $ires2 = Module.value 
        ^
<console>:14: error: value getVal is not a member of object Module 
     Module.value = "???" 
      ^

Module.value = "???"처럼 세터과 같이되지 않았다 보인다.

내 실수는 있습니까? 이 문제를 해결하는 방법?

답변

3

하하, 멋지 네요! 나는 우리가 매크로를 가지고이 재미있는 작은 버그들을 모두 찾았다 고 생각했지만, 분명히 우리는 그렇지 않았다. 나는 당신을 대신하여 버그를 만들었습니다 : https://issues.scala-lang.org/browse/SI-7617.

+0

수정 사항 제출 : https://github.com/scala/scala/pull/2689 –

관련 문제