This is to situate (create a context for) code so that it has access to its “own zone information” and access to a message delivered from the corresponding context of another zone. The print_int below is in such a context. The code in that context relays a message to the next zone and decrements a counter in the message.
let nz j = let neigh = Array.make j (fun m -> 42) in (fun j ne -> neigh.(j) <- ne), (fun k izm -> print_string "thru zone "; print_int izm; print_int k; print_newline (); if izm = 0 then 44 else neigh.(1) (izm-1));; nz : int -> (int -> (int -> int) -> unit) * (int -> int -> int) let z0 = nz 2 and z1 = nz 2 and z2 = nz 2;; z0 : (int -> (int -> int) -> unit) * (int -> int -> int) let intro za zb = match za, zb with ((intNba, iZCa), (intNbb, iZCb)) -> intNba 0 (iZCb 0); intNbb 1 (iZCa 1);; intro : (int -> 'a -> 'b) * (int -> 'c) -> (int -> 'c -> 'd) * (int -> 'a) -> 'd intro z2 z0; intro z0 z1; intro z1 z2;; match z0 with (_, iz) -> iz 9 7;; thru zone 79 thru zone 61 thru zone 51 thru zone 41 thru zone 31 thru zone 21 thru zone 11 thru zone 01 - : int = 44