Blame


1 12687dd9 2023-08-04 jrmu ;; The first three lines of this file were inserted by DrScheme. They record metadata
2 12687dd9 2023-08-04 jrmu ;; about the language level of this file in a form that our tools can easily process.
3 12687dd9 2023-08-04 jrmu #reader(lib "htdp-intermediate-lambda-reader.ss" "lang")((modname |27.2|) (read-case-sensitive #t) (teachpacks ((lib "draw.ss" "teachpack" "htdp") (lib "arrow.ss" "teachpack" "htdp") (lib "gui.ss" "teachpack" "htdp"))) (htdp-settings #(#t constructor repeating-decimal #f #t none #f ((lib "draw.ss" "teachpack" "htdp") (lib "arrow.ss" "teachpack" "htdp") (lib "gui.ss" "teachpack" "htdp")))))
4 12687dd9 2023-08-04 jrmu ;Exercise 27.2.1. Determine what the list-of-lines representation for empty, (list 'NL), and (list 'NL 'NL) should be. Why are these examples important test cases?
5 12687dd9 2023-08-04 jrmu
6 12687dd9 2023-08-04 jrmu ;A file is either
7 12687dd9 2023-08-04 jrmu ;1. empty or
8 12687dd9 2023-08-04 jrmu ;2. (cons s f)
9 12687dd9 2023-08-04 jrmu ;where s is a symbol and f is a file.
10 12687dd9 2023-08-04 jrmu
11 12687dd9 2023-08-04 jrmu ;Examples
12 12687dd9 2023-08-04 jrmu ;
13 12687dd9 2023-08-04 jrmu ;(file->list-of-lines empty)
14 12687dd9 2023-08-04 jrmu ;empty
15 12687dd9 2023-08-04 jrmu ;(file->list-of-lines (list 'NL))
16 12687dd9 2023-08-04 jrmu ;(list empty)
17 12687dd9 2023-08-04 jrmu ;(file->list-of-lines (list 'NL 'NL))
18 12687dd9 2023-08-04 jrmu ;(list empty empty)
19 12687dd9 2023-08-04 jrmu
20 12687dd9 2023-08-04 jrmu ;The NEWLINE character is represented by 'NL
21 12687dd9 2023-08-04 jrmu (define NEWLINE 'NL)
22 12687dd9 2023-08-04 jrmu
23 12687dd9 2023-08-04 jrmu ;file->list-of-lines : file -> (listof (listof symbols))
24 12687dd9 2023-08-04 jrmu ;Converts a-file into a (listof (listof symbols)) representing the file. Each new list starts right at the end of a newline symbol and ends at the first occurrence of a newline symbol. file->list-of-lines uses generative recursion: the first line is appended to the front of the remainder of the file that has already been converted into a list of lines.
25 12687dd9 2023-08-04 jrmu ;Termination Argument: Since each application of file->list-of-lines necessarily shortens the argument for the new generative recursion, the paramater must get smaller over time and eventually become the empty list, for which a trivial solution is available.
26 12687dd9 2023-08-04 jrmu
27 12687dd9 2023-08-04 jrmu ;first-line : file -> (listof symbols)
28 12687dd9 2023-08-04 jrmu ;Returns the first line of a-file.
29 12687dd9 2023-08-04 jrmu
30 12687dd9 2023-08-04 jrmu ;remove-first-line : file -> file
31 12687dd9 2023-08-04 jrmu ;Given a-file, remove the first line.
32 12687dd9 2023-08-04 jrmu
33 12687dd9 2023-08-04 jrmu (define (file->list-of-lines a-file)
34 12687dd9 2023-08-04 jrmu (local ((define (first-line a-file)
35 12687dd9 2023-08-04 jrmu (cond
36 12687dd9 2023-08-04 jrmu [(symbol=? NEWLINE (first a-file)) empty]
37 12687dd9 2023-08-04 jrmu [else (cons (first a-file)
38 12687dd9 2023-08-04 jrmu (first-line (rest a-file)))]))
39 12687dd9 2023-08-04 jrmu (define (remove-first-line a-file)
40 12687dd9 2023-08-04 jrmu (cond
41 12687dd9 2023-08-04 jrmu [(symbol=? NEWLINE (first a-file)) (rest a-file)]
42 12687dd9 2023-08-04 jrmu [else (remove-first-line (rest a-file))])))
43 12687dd9 2023-08-04 jrmu (cond
44 12687dd9 2023-08-04 jrmu [(empty? a-file) empty]
45 12687dd9 2023-08-04 jrmu [else (cons (first-line a-file)
46 12687dd9 2023-08-04 jrmu (file->list-of-lines (remove-first-line a-file)))])))
47 12687dd9 2023-08-04 jrmu
48 12687dd9 2023-08-04 jrmu
49 12687dd9 2023-08-04 jrmu ;(file->list-of-lines '(Hi my name is Joe NL
50 12687dd9 2023-08-04 jrmu ; and I live in a button factory NL
51 12687dd9 2023-08-04 jrmu ; I have a wife NL
52 12687dd9 2023-08-04 jrmu ; and three kids NL))
53 12687dd9 2023-08-04 jrmu ;
54 12687dd9 2023-08-04 jrmu ;A file of numbers (fon) is either
55 12687dd9 2023-08-04 jrmu ;1. empty, or
56 12687dd9 2023-08-04 jrmu ;2. (cons N F),
57 12687dd9 2023-08-04 jrmu ;3. (cons 'NL F)
58 12687dd9 2023-08-04 jrmu ;where N is a number and F is a file.
59 12687dd9 2023-08-04 jrmu
60 12687dd9 2023-08-04 jrmu (define-struct rr (table costs))
61 12687dd9 2023-08-04 jrmu ;
62 12687dd9 2023-08-04 jrmu ;A restaurant is a structure
63 12687dd9 2023-08-04 jrmu ;(make-rr ta co)
64 12687dd9 2023-08-04 jrmu ;where ta is a number and co is a (listof numbers).
65 12687dd9 2023-08-04 jrmu ;
66 12687dd9 2023-08-04 jrmu ;file->list-of-checks : fon -> (listof rr)
67 12687dd9 2023-08-04 jrmu ;Given afon, file->list-of-checks converts afon into a (listof rr). The first number in each line in afon represents the table number and the remaining numbers up to the NEWLINE represent the costs per table. We again use generative recursion. First, we create an rr structure with the first table and its associated costs, and then we append that to the beginning of an already-created (listof rr) of the remaining file-of-numbers.
68 12687dd9 2023-08-04 jrmu ;Termination Argument: each file that is passed into file->list-of-checks must necessary get smaller and ultimately reach empty since one line is removed every recursion.
69 12687dd9 2023-08-04 jrmu ;
70 12687dd9 2023-08-04 jrmu ;Examples
71 12687dd9 2023-08-04 jrmu ;
72 12687dd9 2023-08-04 jrmu ;(equal? (file->list-of-checks
73 12687dd9 2023-08-04 jrmu ; (list 1 2.30 4.00 12.50 13.50 'NL
74 12687dd9 2023-08-04 jrmu ; 2 4.00 18.00 'NL
75 12687dd9 2023-08-04 jrmu ; 4 2.30 12.50))
76 12687dd9 2023-08-04 jrmu ; (list (make-rr 1 (list 2.30 4.00 12.50 13.50))
77 12687dd9 2023-08-04 jrmu ; (make-rr 2 (list 4.00 18.00))
78 12687dd9 2023-08-04 jrmu ; (make-rr 4 (list 2.30 12.50))))
79 12687dd9 2023-08-04 jrmu
80 12687dd9 2023-08-04 jrmu (define (file->list-of-checks afon)
81 12687dd9 2023-08-04 jrmu (cond
82 12687dd9 2023-08-04 jrmu [(empty? afon) empty]
83 12687dd9 2023-08-04 jrmu [(and (symbol? (first afon))
84 12687dd9 2023-08-04 jrmu (symbol=? NEWLINE (first afon))) (file->list-of-checks (remove-first-line afon))]
85 12687dd9 2023-08-04 jrmu [else (cons (make-rr (first-table afon)
86 12687dd9 2023-08-04 jrmu (first-costs afon))
87 12687dd9 2023-08-04 jrmu (file->list-of-checks (remove-first-line afon)))]))
88 12687dd9 2023-08-04 jrmu
89 12687dd9 2023-08-04 jrmu (define (remove-first-line a-file)
90 12687dd9 2023-08-04 jrmu (cond
91 12687dd9 2023-08-04 jrmu [(empty? a-file) empty]
92 12687dd9 2023-08-04 jrmu [(and (symbol? (first a-file))
93 12687dd9 2023-08-04 jrmu (symbol=? NEWLINE (first a-file))) (rest a-file)]
94 12687dd9 2023-08-04 jrmu [else (remove-first-line (rest a-file))]))
95 12687dd9 2023-08-04 jrmu
96 12687dd9 2023-08-04 jrmu ;first-table : fon -> number
97 12687dd9 2023-08-04 jrmu ;Given afon, return the table associated with it (if (first afon) is a number, it is simply the first number--if (first afon) is empty or NEWLINE, it is empty).
98 12687dd9 2023-08-04 jrmu
99 12687dd9 2023-08-04 jrmu (define (first-table afon)
100 12687dd9 2023-08-04 jrmu (cond
101 12687dd9 2023-08-04 jrmu [(number? (first afon)) (first afon)]
102 12687dd9 2023-08-04 jrmu [else 'error]))
103 12687dd9 2023-08-04 jrmu
104 12687dd9 2023-08-04 jrmu ;first-costs : fon -> (listof numbers)
105 12687dd9 2023-08-04 jrmu ;Given afon, return the first line of (listof numbers) after the table number.
106 12687dd9 2023-08-04 jrmu
107 12687dd9 2023-08-04 jrmu (define (first-costs afon)
108 12687dd9 2023-08-04 jrmu (first-line (rest afon)))
109 12687dd9 2023-08-04 jrmu
110 12687dd9 2023-08-04 jrmu ;first-line : (listof X) -> (listof X)
111 12687dd9 2023-08-04 jrmu ;Returns the first line of alox.
112 12687dd9 2023-08-04 jrmu
113 12687dd9 2023-08-04 jrmu (define (first-line a-file)
114 12687dd9 2023-08-04 jrmu (cond
115 12687dd9 2023-08-04 jrmu [(empty? a-file) empty]
116 12687dd9 2023-08-04 jrmu [(and (symbol? (first a-file))
117 12687dd9 2023-08-04 jrmu (symbol=? NEWLINE (first a-file))) empty]
118 12687dd9 2023-08-04 jrmu [else (cons (first a-file)
119 12687dd9 2023-08-04 jrmu (first-line (rest a-file)))]))
120 12687dd9 2023-08-04 jrmu
121 12687dd9 2023-08-04 jrmu ;Tests
122 12687dd9 2023-08-04 jrmu ;(file->list-of-checks (list 1 2.5 3.5 4.5 'NL
123 12687dd9 2023-08-04 jrmu ; 2 3.5 4.5 5.5 'NL
124 12687dd9 2023-08-04 jrmu ; 3 8.5 2.4 3.9 'NL))
125 12687dd9 2023-08-04 jrmu ;
126 12687dd9 2023-08-04 jrmu ;(equal? (file->list-of-checks
127 12687dd9 2023-08-04 jrmu ; (list 1 2.30 4.00 12.50 13.50 'NL
128 12687dd9 2023-08-04 jrmu ; 2 4.00 18.00 'NL
129 12687dd9 2023-08-04 jrmu ; 4 2.30 12.50))
130 12687dd9 2023-08-04 jrmu ; (list (make-rr 1 (list 2.30 4.00 12.50 13.50))
131 12687dd9 2023-08-04 jrmu ; (make-rr 2 (list 4.00 18.00))
132 12687dd9 2023-08-04 jrmu ; (make-rr 4 (list 2.30 12.50))))