#lang racket
(require [only-in plait test test/exn error print-only-errors])
(define (node v l r)
(lambda (m)
(case m
[(sum) (lambda () (+ v (msg l 'sum)
(msg r 'sum)))])))
(define (mt)
(lambda (m)
(case m
[(sum) (lambda () 0)])))
(define (msg obj selector . args)
(apply (obj selector) args))
(define a-tree
(node 10
(node 5 (mt) (mt))
(node 15 (node 6 (mt) (mt)) (mt))))
(test (msg a-tree 'sum) (+ 10 5 15 6))