This example is a distributed application composed of two nodes (running in the same Scheme process). A thread is started on the first node. The thread performs a loop. At each iteration of the loop it prints the name of the node it is running on, then the thread migrates to the other node. This example can easily be changed so that each node is running on a different machine. Say the machines are "foo.com" and "bar.com". The machine "foo.com" should run (define (main) (become-tcp-node 9000 ; TCP port-number for this node 'foo ; name of the first node (lambda () 'no-op))) An the machine "bar.com" should run (define (main) (become-tcp-node 9000 ; TCP port-number for this node 'bar ; name of the second node (lambda () ; start a thread on bar.com (spawn (let ((n1 (current-node)) (n2 (make-tcp-node "foo.com" 9000 'foo))) (let loop ((i 0) (a n1) (b n2)) (if (= i 100) (exit) (begin (if #t (begin (pp (list i 'from (current-node-name)) (current-output-port)) (force-output (current-output-port)) (thread-sleep! .1))) (goto b) (loop (+ i 1) b a)))))))))