;;; $Id: valid-number-mod.scm,v 1.3 2006/01/05 22:24:09 leavens Exp $ ;;; AUTHOR: Gary T. Leavens (module valid-number-mod (lib "typedscm.ss" "typedscm") (provide valid-number?) (require (lib "phone-number-mod.scm" "lib342")) ;;; Need to assume some database to make this work, hence *subscribers* (define *subscribers* (test-type (list-of (pair-of exchange? (list-of subscriber?))) (list (cons (exchange 555) (map subscriber '(1212 0 4234))) (cons (exchange 444) (map subscriber '(8702 9899 0 4212))) (cons (exchange 222) '())))) ;;; The exchanges known (define *known-exchanges* (test-type (list-of exchange?) (map car *subscribers*))) ;;; finding the list of subscribers in an exchange (define lookup-exchange (letrec ((lookup-help (lambda (subscribers-tab ex-num) (cond ((null? subscribers-tab) '()) ((= ex-num (exchange->number (caar (has-type (list-of (pair-of exchange (list-of subscriber))) subscribers-tab)))) (cdar subscribers-tab)) (else (lookup-help (cdr subscribers-tab) ex-num)))))) (lambda (ex-num) (lookup-help *subscribers* (exchange->number ex-num))))) ;;; The interesting code follows ;;;;;;;;;;;;;;;;;;;;; (deftype valid-number? (-> (phone-number) boolean)) (define valid-number? (lambda (num) (let ((ex-num (phone-number->exchange num))) (and (valid-exchange? ex-num) (valid-subscriber? (lookup-exchange ex-num) (phone-number->subscriber num)))))) (deftype valid-exchange? (-> (exchange) boolean)) (define valid-exchange? (lambda (ex-num) (member ex-num *known-exchanges*))) (deftype valid-subscriber? (-> ((list-of subscriber) subscriber) boolean)) (define valid-subscriber? (lambda (exchanges sub-num) (member sub-num exchanges))) ) ;; end module