(define (startup) (display "data base file? (please enclose it in double quotes)") (let* ((db-file (open-input-file (read))) (descr-list (read db-file)) ; read the field descriptor list (all-records (read db-file)) ; read the records (new-db ; construct the updated data base (cond ((not (legal-descr-list? descr-list)) (display '(*** bad field descriptor list ***)) (newline) #f) ((not (legal-db? all-records descr-list)) (display '(*** bad data base)) (newline) #f) (else (process all-records all-records descr-list)) ) ) ) (if new-db ; new-db = cons descr-list records (let ((new-db-file (open-output-file "db.out"))) ; write the new field descriptor list (same as the old) (display (car new-db) new-db-file) (newline new-db-file) ; write the new records (display "(" new-db-file) ; write each record on a separate line (map (lambda (record) (display record new-db-file) (newline)) (cdr new-db) ) (display ")" new-db-file) (newline) "thank you for using our data base") ) ) ) (define (legal-descr-list? L) (read) ) (define (legal-db? L1 L2) (read) ) (define (process working-data-base all-records descr-list) (display descr-list) (map (lambda (record) (display record) (newline)) working-data-base) (newline) (display 'command?) (let ((cmd (read))) (cond ((not (legal-cmd? cmd descr-list)) (display '(*** bad command ***)) (newline) (process working-data-base all-records descr-list)) ((equal? (first cmd) 'reset) (process all-records all-records descr-list)) ((equal? (first cmd) 'quit) (cons descr-list working-data-base)) ((equal? (first cmd) 'sort) (process working-data-base all-records descr-list)) ((equal? (first cmd) 'or) (process working-data-base all-records descr-list)) (else (process working-data-base all-records descr-list) ) ) ) ) (trace legal-descr-list? legal-db? process)