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