#lang racket (require racket/trace) (require "chez-init.rkt") ;; (define zero (lambda () '())) ;; (define iszero? null?) ;; (define successor (lambda (n) (cons 42 n))) ;; (define predecessor cdr) (define zero (lambda () 0)) (define iszero? zero?) (define successor (lambda (n) (+ 1 n))) (define predecessor (lambda (n) (- n 1))) ;(define-datatype number number? ; 'nyi) (define one (successor (zero))) (define two (successor (successor (zero)))) ;;; Code below is implementation independent (define plus (lambda (x y) (if (iszero? x) y (successor (plus (predecessor x) y))))) (define-datatype bintree bintree? [null-node] [leaf-node (datum number?)] [interior-node (datum number?) (left-tree bintree?) (right-tree bintree?)]) (define sum (lambda (t) (cases bintree t [null-node () 0] [leaf-node (datum) datum] [interior-node (datum pig cow) (+ datum (sum pig)(sum cow))]))) (define t1 (leaf-node 3)) (define t2 (leaf-node 4)) (define t3 (interior-node 5 t1 t2)) (define t4 (interior-node 6 t3 (leaf-node 7))) ;; bintree with null nodes. ;; (define-datatype bintree bintree? ;; [leaf-node ;; (datum number?)] ;; [null-node] ;; [interior-node ;; (datum number?) ;; (left-tree bintree?) ;; (right-tree bintree?)]) ;; (define sum ;; (lambda (tree) ;; (cases bintree tree ;; [null-node () 0] ;; [leaf-node (datum) datum] ;; [interior-node (datum left ;; right) ;; (+ datum (sum left) (sum ;; right))]))) ;;(trace sum) ;; (define-datatype bintree bintree? ;; [leaf-node ;; (datum foo?)] ;; [interior-node ;; (datum number?) ;; (left-tree bintree?) ;; (right-tree bintree?)]) ;; ;; (define foo? ;; (lambda (x) ;; (or (number? x)(null? x)))) ;; ;; (define sum ;; (lambda (tree) ;; (cases bintree tree ;; [leaf-node (datum) (if (null? datum) ;; 0 ;; datum)] ;; [interior-node (datum left right) ;; (+ datum (sum left) (sum ;; right))]))) ;;(trace sum)