#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)