UNB/ CS/ David Bremner/ teaching/ cs4613/ tutorials/ tutorial06/ tree3.rkt
#lang plait
(define (msg0 obj selector) (obj selector))

(define (node v l r)
  (lambda (m)
    (case m
      [(value) v]
      [(left)  l]
      [(right) r]
      [(sum) (+ v (+ (msg0 l 'sum) (msg0 r 'sum)))]
      [else (error 'node (symbol->string m))])))

(define (mt)
  (lambda (m)
    (case m
      [(sum) 0]
      [else (error 'mt (symbol->string m))])))

(define tree1 (node 1 (mt) (mt)))
(test (msg0 tree1 'sum) 1)
(test (msg0 tree1 'value) 1)