Re[5]: Context Receivers
От: kov_serg Россия  
Дата: 11.05.22 20:10
Оценка:
Здравствуйте, ·, Вы писали:

_>>Помимо всего прочего их можно использовать для построения графа вычислений по выражению.

·>Не очень ясно как. Для этого надо захватывать аргументы, а не их значения. Или я не понял что ты имеешь в виду.
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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.