Rholang Lab #1 Notes:
The main theme was a gradual progression from cell to account.
contract Cell(get, set, state) { select { case ret <- get; val <- state { ret!(val) | state!(val) | cell(get, set, state) } case newval <- set, _ <- state { state!(newval) | cell(get, set, state) } } }
// Note that for the general case, we could use function discipline to apply any transformation to mod, but for this purpose, simple inc/dec is fine. contract ModCell(get, mod, state) { select { case ret <- get; val <- state { ret!(val) | state!(val) | cell(get, mod, state) } case delta <- mod, val <- state { state!(val + delta) | cell(get, mod, state) } } }
contract Balance(get, mod, state) { select { case ret <- get; val <- state { ret!(val) | state!(val) | cell(get, mod, state) } case (delta, ack) <- mod, val <- state { // We probably should have if/else sugar that desugars to case on a bool. if (val + delta) >= 0 { state!(val + delta) | ack!(true) | cell(get, mod, state) } else { state!(val) | ack!(false) | cell(get, mod, state) } } } }
contract Account(get, mod, xfer, state) { select { case ret <- get; val <- state { ret!(val) | state!(val) | cell(get, mod, xfer, state) } case (delta, ack) <- mod, val <- state { // We probably should have if/else sugar that desugars to case on a bool. if (val + delta) >= 0 { state!(val + delta) | ack!(true) | cell(get, mod, xfer, state) } else { state!(val) | ack!(false) | cell(get, mod, xfer, state) } } // This could more directly use the state name of the src Account. case (delta, srcmod, ack) <- xfer; val <- state { if (val + delta) < 0 { state!(val) | ack!(false) | cell(get, mod, xfer, state) } else { new ret in { srcmod!(-delta, ret) select { case true <- ret { state!(val + delta) | ack!(true) | cell(get, mod, xfer, state) } case false <- ret { state(!val) | ack(!false) | cell(get, mod, xfer, state) } } } // end new } // end else } // end xfer case } // end select } // end contract