(define (mycons x y)
(lambda (m . v)
(cond ((eq? m 'car) x) ((eq? m 'cdr) y)
((eq? m 'setcar) (set! x (car v)))
((eq? m 'setcdr) (set! y (car v)))
(else (error "Argument not CAR or CDR -- CONS" m)))))
(define (mycar z) (z 'car))
(define (mycdr z) (z 'cdr))
(define (mysetcar! z newx) (z 'setcar newx))
(define (mysetcdr! z newy) (z 'setcdr newy))
(define k (mycons 1 2))
(write (list (mycar k) (mycdr k) k))
(mysetcdr! k -2)
(write (list (mycar k) (mycdr k)))
(mysetcar! k 12)
(write (list (mycar k) (mycdr k)))
(mysetcar! k 5) (mysetcdr! k 33)
(write (list (mycar k) (mycdr k)))
; --> (1 2 #<procedure:/t.scm:3:2>)(1 -2)(12 -2)(5 33)
; because it is Sche