我想在一组“条件动作”规则中使用 Scala 模式匹配的强大功能。这些规则不是事先知道的,而是根据一些复杂的标准在运行时生成的。算法生成机制可以被认为是完全独立的,不是这个问题的一部分,它涉及如何通过 Scala 反射/准引用来表达这一点。
具体来说,我希望case v0@x(v1,_,v2): X => f(v1,v2)
在运行时生成(一般形式的)案例定义。
toolBox.parse(str)
对于在运行时生成的某些字符串,大概可以做到这一点。但是,如果可能的话,似乎需要包含比这更大程度的类型安全:
Term,Var(name: Char),Lit(value:Int),Group(a: Term,b: Term,c: Term)
更具体地说,我希望case defs 与Terms ( )的密封case 类层次结构相匹配。
例如,生成的案例 def 通常会返回一些无函数、部分或全部 v0、v1、v2:
t match {
case v0@Group(v1@_,v2@Var('a')) => Group(v2,v0,Group(v1,Var('z'),Lit(17))) // etc
}
我正在尝试按照此处给出的 case defs 的 quasiquotes 描述进行操作,但语法相当令人费解(并且 Scala 2.11 的 eclipse 拒绝向我显示类型),所以下面是我所得到的. 我的具体问题嵌入在代码中:
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?
???
}