我想在凯马实现一个“承诺选择”操作(以及其他一些以类似方式工作的函数)。在凯马/斯卡拉有条件地重写术语
我想重写一个术语,如果其中一个子项可以被成功重写(想法是一旦你开始任何一个分支,你承诺)。
目前,我能做到这样的:
import org.kiama.rewriting.Rewriter
import org.junit.Test
case class B(l:L,r:L)
case class L(s:String)
class RewriteExperiment extends Rewriter {
def r1 = rule {
case L(l) if l.s == "X" => L("Did stuff")
}
def r2 = strategy {
case B(l,r) => r1(l) match {
case Some(x:L) => Some(B(x,"Avoided"))
case _ => None
}
}
implicit def s2l(s:String) : L = L(s)
}
class RewriteTest extends RewriteExperiment {
@Test
def testPruning : Unit = {
println(rewrite(r2)(B("P","b")))
println(rewrite(r2)(B("X","b")))
}
}
所以R2只有火灾时,它可以申请R1向第一subterm成功。
这并不觉得很开基马。我有一种感觉,我应该使用congruences,但我无法弄清楚他们是如何从文档中工作的。
任何人都可以建议一个更优雅和Kiamaish的方式来做到这一点?