我想在凱馬實現一個「承諾選擇」操作(以及其他一些以類似方式工作的函數)。在凱馬/斯卡拉有條件地重寫術語
我想重寫一個術語,如果其中一個子項可以被成功重寫(想法是一旦你開始任何一個分支,你承諾)。
目前,我能做到這樣的:
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的方式來做到這一點?