#lang racket (require "utilities.rkt") ;; ------------------------------------------------------------------------ ;; the set-up: a simple program ;; ------------------------------------------------------------------------ (define hypotenuse (lambda (m n) (sqrt (+ (* m m) (* n n))))) (define right-triangle (lambda () (let ((x (read-num "One side of triangle:")) (y (read-num "The other side:"))) (displayln "The hypotenuse is " (hypotenuse x y))))) ;; ------------------------------------------------------------------------ ;; read-num ;; ------------------------------------------------------------------------ (define read-num (lambda (prompt) (display prompt) (display " ") (let ((answer (read))) (if (number? answer) answer (begin (displayln "Illegal value") (read-num prompt)))))) ;; ------------------------------------------------------------------------ ;; read-type produces prompted read functions for any given type! ;; Notice how it uses letrec to create and return a recursive function. ;; ------------------------------------------------------------------------ (define read-type (lambda (type?) (letrec ((reader (lambda (prompt) (display prompt) (display " ") (let ((answer (read))) (if (type? answer) answer (begin (displayln "Illegal value") (reader prompt))))))) reader))) ;; (define read-num (read-type number?)) ;; (define read-str (read-type string?)) ;; ------------------------------------------------------------------------