Pular para o conteúdo

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.

counter.zolo
Playground
// 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:

main.zolo
Playground
// 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.

Buscar no Zolo

9 resultados

enespt-br