我正在尝试在 Kiama 中实现“承诺选择”操作(以及以类似方式工作的其他一些功能)。
我想重写一个术语,如果它的一个子术语可以被成功重写(这个想法是,一旦你启动任一分支,你就已经承诺了)。
目前,我可以这样做:
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 应用于第一个子项时才会触发。
这感觉不太像 Kiama-ish。我觉得我应该使用同余,但我无法从文档中弄清楚它们是如何工作的。
谁能建议一种更优雅和 Kiamaish 的方式来做到这一点?