;;;; The agent, end to end: a running program takes a redefinition over a ;;;; socket and installs it between "frames". ;;;; ;;;; [tick] is the function that gets redefined. It is called once before any ;;;; reload and once after each of two of them, and nothing else in this file ;;;; changes, so the three numbers are the whole result. Two reloads and not ;;;; one because that is the daemon's actual loop: a second module built from ;;;; the same session, reading state the first one introduced. ;;;; ;;;; It waits rather than polling on a timer because a test that races the ;;;; frame rate is a test that fails on a loaded machine. A game loop calls ;;;; poll at the top of the frame and ignores the answer; the split is in ;;;; vendor/agent/agent.flan. (import agent "vendor:agent") (defvar ticks i64) (defn tick [] i64 (set ticks (+ ticks 1)) ticks) (defn main [args [string]] i32 (if (< (len args) 2) (do (print-line "usage: agent ") 2) (do (if (< (agent/start (at args 1)) 0) (do (print-line "cannot listen") 1) (do (print-i64 (tick)) (newline) (while (= (agent/wait 100) 0) 0) (print-i64 (tick)) (newline) (while (= (agent/wait 100) 0) 0) (print-i64 (tick)) (newline) 0)))))