2013-12-23 135 views
0

是否可以執行以下操作使用Scala宏:斯卡拉通用宏觀

trait Cacheable { 
    def cache[T](genValue: => Future[T]): Future[T] = macro Cacheable.cacheImpl[T] 
} 

object Cacheable { 
    def cacheImpl[A: c.WeakTypeTag](c: Context) 
           (genValue: c.Expr[Future[A]]): c.Expr[Future[A]] = { 
    import c.universe._ 

    reify { 
     genValue.splice 
    } 
    } 
} 

它不會在可緩存特性以下消息宏功能調用編譯:

在這多個標記行 - 宏實現形狀不正確:必需: (c:scala.reflect.macros.Context)(genValue:c.Expr [=> scala.concurrent.Future [T]]):c.Expr [scala.concurrent 。未來[T]]發現:(c:scala.reflect.macros.Context)(genValue:c.Expr [scala.concurrent.Future [A]]):c.Expr [scala.concurrent.Future [A]]類型不匹配param eter genValue:c.Expr [=> scala.concurrent.Future [T]]不符合c.Expr [scala.concurrent.Future [?A]] - 宏實現的形狀不正確:required:(c:scala。 reflect.macros.Context)(genValue:c.Expr [=> scala.concurrent.Future [T]]):c.Expr [scala.concurrent.Future [T]] found:(c:scala.reflect.macros。 (genValue:c.Expr [scala.concurrent.Future [A]]):參數genValue的c.Expr [scala.concurrent.Future [A]]類型不匹配:c.Expr [=> scala.concurrent.Future [T]不符合c.Expr]

回答

-1

首先得到你的簽名權[scala.concurrent.Future [A?]:

import concurrent.Future 
import language.experimental.macros 
import reflect.macros.Context 

trait Cacheable { 
    def cache[A](genValue: => Future[A]): Future[A] = macro Cacheable.cacheImpl[A] 
} 

object Cacheable { 
    def cacheImpl[A: c.WeakTypeTag](c: Context) 
           (genValue: c.Expr[Future[A]]): c.Expr[Future[A]] = ??? 
} 

的錯誤是明顯的:

<console>:12: error: macro implementation has wrong shape: 
required: (c: scala.reflect.macros.Context)(genValue: c.Expr[=> scala.concurrent.Future[A]]): c.Expr[scala.concurrent.Future[A]] 
found : (c: scala.reflect.macros.Context)(genValue: c.Expr[scala.concurrent.Future[A]]): c.Expr[scala.concurrent.Future[A]] 
type mismatch for parameter genValue: c.Expr[=> scala.concurrent.Future[A]] does not conform to c.Expr[scala.concurrent.Future[?A]] 
     def cache[A](genValue: => Future[A]): Future[A] = macro Cacheable.cacheImpl[A] 
                     ^

您正在請求cache方法中的按名稱調用參數,但在宏實現方法中使用了一個渴望類型。

沒有相應的類型c.Expr[=> Future[A]]我非常懷疑有可能表達這種類型。因爲宏將表達式轉換爲Future[A],所以如果您想要「按需」使用該表達式,則必須在由宏生成的AST中提供機制。既然你的返回類型是Future[A]而不是,例如() => Future[A],我不知道你會如何實現這個目標,或者你想要達到的目標。

+0

謝謝您的回覆。我沒有在尋找關於代碼片段的有效性或有用性的評論,也沒有尋找對錯誤消息的解釋更多的評論,以回答這樣的片段是否以另一種形式有效。道歉,如果我沒有完全正確的話。 – user3130760