UNB/ CS/ David Bremner/ teaching/ cs4613/ lectures/ lecture07/ tree-sum3.rkt
#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))