#lang racket ; a binary numeric tree is a ; leaf vertex - which is a single element list containing a number ; internal vertes - which is a 2-element list, each element being ; a binary numeric tree. ; constructors are not needed since we just use list operations, and ; we are being lazy. (define (MakeLeaf v) (list v)) (define (Join t0 t1) (list t0 t1)) ; fetch Left and Right subtrees (define Left (lambda (tree) (first tree))) (define Right (lambda (tree) (second tree))) (define Value (lambda (tree) (first tree))) ; is the tree a leaf? (define AtBase? (lambda (tree) (null? (rest tree)))) ; if so, you can fetch the leaf value (define BaseCase (lambda (tree) (first tree))) ; if not, you can add together the two subtrees (define Combine (lambda (tree l r) (+ l r))) (define val (lambda (tree) (if (AtBase? tree) (BaseCase tree) (Combine tree (val (Left tree)) (val (Right tree))) ))) (define val-cc (lambda (tree cc) (if (AtBase? tree) (cc (BaseCase tree)) (val-cc (Left tree) (lambda (lval) (val-cc (Right tree) (lambda (rval) (cc (Combine tree lval rval))))))) )) (define t '( (1) ( (2) (3) ))) (val t) (val-cc t (lambda (x) x))