Skip to content
Stephen De Gabrielle edited this page Feb 28, 2023 · 5 revisions

!rkt eval

#lang racket/base
;; coroutines implementation from https://hillside.net/plop/plop2001/accepted_submissions/PLoP2001/dferguson0/PLoP2001_dferguson0_1.pdf
; 
(define (coroutine-maker proc)
  (define saved-continuation '())
  (define (update-continuation! v)
    (set! saved-continuation v))
  (define resumer (resume-maker update-continuation!))
  (define first-time #t)
  (define (f value)
    (cond
      [first-time
       (set! first-time #f)
       (proc resumer value)]
      [else (saved-continuation value)]))
  f)

(define ((resume-maker update-proc!) next-coroutine value) 
  (define (receiver continuation)
    (update-proc! continuation)
    (next-coroutine value))
  (call-with-current-continuation receiver))

;; tests


(define (ping-procedure resume value)
  (displayln "Pinging 1")
  (resume pong value)
  (displayln "Pinging 2")
  (resume pong value)
  (displayln "Pinging 3")
  (resume pong value))

(define ping (coroutine-maker ping-procedure))


(define (pong-procedure resume value)
  (displayln "Pinging 1")
  (resume ping value)
  (displayln "Pinging 2")
  (resume ping value)
  (displayln "Pinging 3")
  (resume ping value))

(define pong (coroutine-maker pong-procedure))


(ping 1)
Clone this wiki locally