2013-08-31 4 views
2

Compilation issue when accessing parameter value in Scala macro에서부터 술어를 적용하는 매크로를 정의하고자합니다. fn = c.eval (pred) 문이 있으면 클라이언트 코드가 문제의 본질에 대한 어떤 표시도없이 컴파일되지 않습니다.매크로에서 고차 함수 전달 및 호출

def fnInvocation(value : Int, pred : c.Expr[ Int => Boolean ]): Boolean = fnInvocationImpl 

def fnInvocationImpl(c: Context)(value : Int, pred : c.Expr[ Int => Boolean ]) : c.Expr[Boolean] = { 
    var fn = x => x % 2 == 0 
    // fn = c.eval(pred) // client compilation fails if this line is included 
    val result = fn(value) 
    c.literal(result) 
} 

나는 매크로 내에서이 작업을 수행 할 수 있어야한다?

답변

1

매크로 메서드 자체에는 초기 컨텍스트 매개 변수 목록이 없으므로 식 인수가 있어야 의미가 없습니다. 한편, 구현시, 모든 인수 (컨텍스트를 사용한 초기 매개 변수 목록 뒤) 은 표현식이어야합니다. 귀하의 경우에는

서명은 다음과 같이해야합니다 : my previous answer에서

def fnInvocation(value: Int, pred: Int => Boolean): Boolean = 
    macro fnInvocationImpl 

def fnInvocationImpl(c: Context)(
    value: c.Expr[Int], 
    pred: c.Expr[Int => Boolean] 
): c.Expr[Boolean] = ??? 

코멘트도 여기에 적용됩니다. 두 인수가 모두 컴파일 타임 리터럴 인 경우 컴파일 타임에 응용 프로그램을 수행 할 수 있습니다.이 예제가 함수 리터럴과 함께 작동하는 방법은 my gist here for an example을 참조하십시오. 둘 다 리터럴이 아닌 경우 런타임에 응용 프로그램을 수행하는 트리를 작성할 수 있습니다. 인수가 둘 다 리터럴인지 여부를 확인하고 함수를 적용하고 컴파일 타임 리터럴을 반환하고 그렇지 않으면 트리를 생성하는 것으로 되돌아 갈 수 있습니다. 값이 리터럴이 아닌 경우 컴파일 타임에 응용 프로그램을 수행하면 안됩니다.

+0

> 표현 인수를 이해하는 것은 이해가되지 않습니다. 이해할 수 없습니다 .-이 질문에 '잘라 붙이기'오류가 있습니다 .-) > 어떻게 이런 일이 일어나는가에 대한 예를 보려면 여기를 클릭하십시오. > with function literals 그래서'function literal '은 효과적으로'lambda expression'입니까? 아니면 컴파일 타임에 평가할 수있는 것에 관한 미묘한 점이 있습니까? 컴파일 타임에 평가할 수있는 것과 실행시에 수행해야 할 것을 구별하는 방법에 대해서는 명확하지 않습니다. 유용한 가이드 라인이 있습니까? 어쨌든, 모든 도움에 감사합니다. – NietzscheanAI

+0

@ user217281728 -이 동일한 문제가 발생했다고 생각합니다. http://stackoverflow.com/questions/36634787/scala-not-found-value-macro?noredirect=1#comment60864975_36634787 –