(a)
(define-cbr (f a b)
   (swap a b))

; Produces 2:
(let ((x 1) (y 2))
   (f x y)
   x)

(b)
(define (do-f get1 get2 set1 set2)
   (define-get/set-var a get1 set1)
   (define-get/set-var b get2 set2)
   (swap a b))

(c)
(let ((x 1) (y 2))
   (f x y)
  x)

(d)
(let ((x 1) (y 2))
   (do-f (lambda () x)
         (lambda () y)
         (lambda (v) (set! x v))
         (lambda (v) (set! y v)))
   x)

(e)
(begin
   (define (do-f get1 get2 set1 set2)
      (define-get/set-var a get1 set1)
      (define-get/set-var b get2 set2)
      (swap a b))
   (define-syntax f
      (syntax-rules ()
        ((f actual ...)
         (do-f (lambda () actual)
               ...
               (lambda (v)
                  (set! actual v))
               ...)               ))))

Example 8: Call-by-reference.

Back to Article