26 · Efectos Algebraicos
Reemplazos tipados de handlers
Un handler con selectores de operaciones sustituye solo esas operaciones y conserva la cobertura de efectos y el tipo de respuesta restantes. Las firmas y cuerpos se comprueban contra el efecto real. La composición conserva el frame y la semántica léxica de abort.
En esta página
Un handler con selectores de operaciones sustituye solo esas operaciones y conserva la cobertura de efectos y el tipo de respuesta restantes. Las firmas y cuerpos se comprueban contra el efecto real. La composición conserva el frame y la semántica léxica de abort.
Ejemplo completo
Reemplazos tipados de handlers.
typed-handler-overrides.zolo
// Composition preserves base evaluation, closures and lexical cleanup.
effect Clock { fn now() -> int; fn zone() -> str }
effect Store { fn put(value: int) -> int }
var calls = 0
var builds = 0
var events = ""
let fixed_time = 42
let __zolo_frame_id_0 = 0
let __zolo_handler_override_compose_0 = 0
let real_world: handler<Clock + Store, int> = handler {
Clock::now() => resume(1),
Clock::zone() => resume("UTC"),
Store::put(value) => resume(value + 1),
}
fn choose(value: handler<Clock + Store, int>) -> handler<Clock + Store, int> { value }
// Forwarding an opaque handler parameter does not establish composition origin.
let test_world = ({ builds += 1; real_world }) with {
Clock::now() => { calls += 1; defer { events += "defer/" }; fixed_time + __zolo_frame_id_0 + __zolo_handler_override_compose_0 },
}
print(with test_world { perform Clock::now() + perform Store::put(2) })
print(with test_world { perform Clock::zone(); 7 })
print(with test_world { perform Clock::now() })
print(calls)
print(events)
print(builds)
let twice = test_world with { Store::put(value: int) => value + 10 }
print(with twice { perform Store::put(2) })
fn lexical(value: handler<Clock + Store, int>) -> int {
defer { events += "caller/" }
with value { return 9 }
0
}
print(lexical(twice))
print(events)
Reglas y comportamiento
Handlers y ámbitos de recursos · Documentación
Desde un checkout del repositorio:
zolo examples/features/typed-handler-overrides.zolo
Consulta también