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