正如本評論中提到的,這可以在編譯時使用Scala宏來完成。
一個可能的選擇是將原始調用擴展到一個宏,它查詢必要的信息,然後調用一個內部的getInfoMethod,它對信息做了一些事情。
爲
getInfo
功能
示例:
宏
import scala.language.experimental.macros
//getInfo method which gets expanded to macro
def getInfo(func: => Any):Unit = macro FindFreeVars.findMacro
def getInfoInternal(info: Any) {
//Do something with the collected information
}
實施例:
//Macro delclaration
def getInfoMacro(c: Context)(func: c.Tree): c.Expr[Unit] = {
import c.universe._
//Extract information, like enclosingPosition or symols from the function tree.
val functionInfo = getFunctionInfo(func)
//Call internal method
c.Expr[List[(String, Any)]](q"getInfoInternal($func, $closedVars)")
}
更多關於Symbols, Trees and Types用於分析。
More complete example通過應用相同的技術來查找從函數中的另一範圍綁定的所有變量的宏。
函數不能這樣做,因爲AST只存在於編譯時。 'getInfo'必須是一個宏。 –
因此理論上可以構建一個宏,它在編譯時提取信息並將其作爲某種標記添加到函數中? – Emiswelt
是的,確實如此。 –