Kiama で「コミットされた選択」操作を実装しようとしています (同様の方法で機能する他の機能と共に)。
サブタームの 1 つが正常に書き直せる場合は、タームを書き直したいです (いずれかのブランチを開始すると、コミットされるという考えです)。
現在、私は次のようにすることができます:
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 を最初のサブタームに正常に適用できる場合にのみ起動します。
これはあまりキアマっぽい感じがしません。合同を使用する必要があると感じていますが、ドキュメントからどのように機能するかわかりません。
これを行うためのよりエレガントでキアマイ風の方法を提案できる人はいますか?