我想在一組「條件動作」規則中使用Scala模式匹配的強大功能。這些規則並不是事先知道的,而是根據一些複雜的標準在運行時生成的。 algorithmic generation mechanism可以被認爲是完全獨立的,而不是這個問題的一部分,它涉及如何通過Scala反射/ quasiquotes來表達這個問題。Scala:動態生成案例類的匹配子句
具體而言,我期望在運行時生成案例定義(通用形式case [email protected](v1,_,v2): X => f(v1,v2)
)。
大概可以通過toolBox.parse(str)
爲運行時生成的某個字符串執行此操作。然而,如果可能的話,似乎需要包含比這更高的類型安全度:
更具體地說,我希望案例defs匹配一個密封案例類層次結構的術語(Term,Var(name: Char),Lit(value:Int),Group(a: Term,b: Term,c: Term)
)。
例如,產生的情況下,高清會在一般情況下,返回沒有的一些功能,部分或全部V0,V1,V2的:
t match {
case [email protected]([email protected]_,[email protected]('a')) => Group(v2,v0,Group(v1,Var('z'),Lit(17))) // etc
}
我試圖在quasiquotes的描述跟進對於案例defs給出here,但語法相當精神彎曲(和Scala 2.11拒絕向我展示類型),所以下面是我所知道的。我的具體問題嵌入代碼:
def dynamicMatch(condition: SomeType, action: SomeType, tb: ToolBox)
(t: Term): Option[Term] = {
// Q1. What type should condition and action be for maximum
// typesafety in the calling code? Symbols? Quasiquotes?
// Would they best be combined into a single actual CaseDef?
// This is obviously a hardcoded placeholder expression, in general:
// Q2. How to bind in t, condition and action?
val q"$expr match { case ..$cases }" =
q"foo match { case _ : Term => Some(expr) case _ => None }"
val cq"$pat1 => $body1" :: cq"$pat2 => $body2" :: Nil = cases
// Q3. how should this be invoked to return the desired result?
???
}
你想用這個做什麼?這一切都發生在編譯時,而不是運行時。 –
你能解釋一下爲什麼你需要這個?我想知道對象的運行時反射可能比使用宏來生成匹配語句更好嗎?如果你希望在這裏找到答案,我認爲你需要使這個問題更容易獲得。 – Rich
@ m-z在運行時可以生成CaseDefs,但是對嗎?據推測,人們可以簡單地使用toolBox.parse(「case X => Y」)作爲可以在運行時生成的一些字符串,我所要求的部分是可以用來代替String的最強類型。 – NietzscheanAI