Здравствуйте, ·, Вы писали:
_>>Помимо всего прочего их можно использовать для построения графа вычислений по выражению.
·>Не очень ясно как. Для этого надо захватывать аргументы, а не их значения. Или я не понял что ты имеешь в виду.
class Vars {
var last_id:Int=0
fun newID() = last_id++
fun input(name:String):Var {
var v=Var()
println("R${v.id}=$name")
return v
}
fun output(name:String,v:Var) {
println("$name=R${v.id}")
}
fun emit_add(res:Var,a:Var,b:Var):Var {
println("R${res.id}=R${a.id}+R${b.id}")
return res
}
fun emit_mul(res:Var,a:Var,b:Var):Var {
println("R${res.id}=R${a.id}*R${b.id}")
return res
}
}
context(Vars) class Var { val id:Int=newID() }
context(Vars) operator fun Var.plus(rv:Var):Var { return emit_add(Var(),this,rv) }
context(Vars) operator fun Var.times(rv:Var):Var { return emit_mul(Var(),this,rv) }
fun main() {
with( Vars() ) {
val a=input("a")
val b=input("b")
val c=input("c")
val d=(a+b*c)*(a+b)
output("result",d)
}
}
R0=a
R1=b
R2=c
R3=R1*R2
R4=R0+R3
R5=R0+R1
R6=R4*R5
result=R6