UNB/ CS/ David Bremner/ teaching/ cs4613/ lectures/ lecture06/ obj2.rkt
#lang racket
(require [only-in plait test test/exn error print-only-errors])

(define o
  (lambda (m)
    (case m
      [(add1) (lambda (x) (+ x 1))]
      [(sub1) (lambda (x) (- x 1))])))

(define (msg obj selector . args)
  (apply (obj selector) args))

(define-syntax snd
  (syntax-rules ()
    [(_ obj selector args ...)
     ((obj (quote selector)) args ...)]))

(test (msg o 'sub1 6) 5)
(test (snd o sub1 6) 5)