Preservação de Estado
Nesta página
Quando a VM faz o swap de um módulo ela mescla as exportações novas sobre a tabela existente. Para valores não-função, se o tipo de runtime da cópia viva coincide com o do inicializador novo, a cópia viva é mantida e o literal novo é descartado. É assim que um contador continua crescendo mesmo depois de editar a função que o imprime.
O módulo counter mantém o estado interno em state, um mapa com o campo
count. Para incrementar corretamente o valor que sobrevive entre swaps, a
escrita deve acontecer através de package.loaded["counter"] — nunca por
meio de uma captura local, que aponta para a cópia antiga após o swap.
Edite só o formato do print; o número continua crescendo sem resetar.
// Feature: state preserved by type on hot-reload
// Syntax: `pub let counter = 0` — literal initializer.
// When to use: we want to edit the fn but keep the accumulated value.
//
// Critical pattern: to mutate the preserved value, write via
// `package.loaded["counter"]`. Mutations through a `local` captured
// inside the closure only affect the old version of the module after swap.
use std::package
let state = #{count: 0}
pub fn bump() {
let live = package.loaded["counter"]
// Edit the string below while the program runs — the number
// keeps growing, it does NOT reset to 0.
live.state.count = live.state.count + 1
print("Count: {live.state.count}")
}
Requer a CLI/host do Zolo — abra no playground ou rode localmente.
O ponto de entrada apenas chama bump() a cada ENTER, sem nenhum conhecimento
do mecanismo de preservação:
// Feature: state lives across reloads
// Syntax: `pub let` with a stable runtime type is preserved.
// When to use: counters, caches, sessions — anything you want
// to keep "alive" across edits.
use counter::{bump}
fn main() {
print("ENTER increments the counter. 'q' to quit.")
print("Edit counter.zolo (e.g. the print format) — the value persists.")
while true {
let line = io::read("*l")
if line is nil || line == "q" {
break
}
bump()
}
}
Requer a CLI/host do Zolo — abra no playground ou rode localmente.
Desafio
Adicione um segundo campo max_seen: int = 0 ao mapa state em counter.zolo
e atualize bump() para registrá-lo. Edite e salve várias vezes: confirme que
max_seen é preservado entre reloads assim como count.
Veja também