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