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-reader.ss" "lang")((modname 14.4.1) (read-case-sensitive #t) (teachpacks ((lib "draw.ss" "teachpack" "htdp") (lib "arrow.ss" "teachpack" "htdp"))) (htdp-settings #(#t constructor repeating-decimal #f #t none #f ((lib "draw.ss" "teachpack" "htdp") (lib "arrow.ss" "teachpack" "htdp")))))
4 12687dd9 2023-08-04 jrmu ;A operator structure is a sturcture
5 12687dd9 2023-08-04 jrmu ;(operator left right) where operator represents
6 12687dd9 2023-08-04 jrmu ;one of the primitive operators mul (multiplication),
7 12687dd9 2023-08-04 jrmu ;add (addition), sub (subtraction), and div
8 12687dd9 2023-08-04 jrmu ;(division). Left and right are numbers or symbols
9 12687dd9 2023-08-04 jrmu ;(symbols represent variables, which ultimately
10 12687dd9 2023-08-04 jrmu ;represent numbers).
11 12687dd9 2023-08-04 jrmu (define-struct add (left right))
12 12687dd9 2023-08-04 jrmu (define-struct sub (left right))
13 12687dd9 2023-08-04 jrmu (define-struct mul (left right))
14 12687dd9 2023-08-04 jrmu (define-struct div (left right))
15 12687dd9 2023-08-04 jrmu ;
16 12687dd9 2023-08-04 jrmu ;(+ 10 -10)
17 12687dd9 2023-08-04 jrmu ;(make-add 10 -10)
18 12687dd9 2023-08-04 jrmu ;
19 12687dd9 2023-08-04 jrmu ;(+ (* 20 3) 33)
20 12687dd9 2023-08-04 jrmu ;(make-add (make-mul 20 3) 33)
21 12687dd9 2023-08-04 jrmu ;
22 12687dd9 2023-08-04 jrmu ;(* 3.14 (* r r))
23 12687dd9 2023-08-04 jrmu ;(make-mul 3.14 (make-mul 'r 'r))
24 12687dd9 2023-08-04 jrmu ;
25 12687dd9 2023-08-04 jrmu ;(+ (* 9/5 c) 32)
26 12687dd9 2023-08-04 jrmu ;(make-add (make-mul 9/5 'c) 32)
27 12687dd9 2023-08-04 jrmu ;
28 12687dd9 2023-08-04 jrmu ;(+ (* 3.14 (* o o))
29 12687dd9 2023-08-04 jrmu ; (* 3.14 (* i i)))
30 12687dd9 2023-08-04 jrmu ;(make-add (make-mul 3.14 (make-mul 'o 'o))
31 12687dd9 2023-08-04 jrmu ; (make-mul 3.14 (make-mul 'i 'i)))
32 12687dd9 2023-08-04 jrmu
33 12687dd9 2023-08-04 jrmu (define struct1 (make-add (make-mul 3.14 (make-mul 'o 'o))
34 12687dd9 2023-08-04 jrmu (make-mul 3.14 (make-mul 'i 'i))))
35 12687dd9 2023-08-04 jrmu (define struct2 (make-add (make-mul 3.14 (make-mul 4 5))
36 12687dd9 2023-08-04 jrmu (make-mul 3.14 (make-mul 9 2))))
37 12687dd9 2023-08-04 jrmu
38 12687dd9 2023-08-04 jrmu ;The SchemeData that we consider are
39 12687dd9 2023-08-04 jrmu ;1. numbers
40 12687dd9 2023-08-04 jrmu ;2. symbols, and
41 12687dd9 2023-08-04 jrmu ;3. the structures add, mul, div, sub.
42 12687dd9 2023-08-04 jrmu
43 12687dd9 2023-08-04 jrmu ;Definition
44 12687dd9 2023-08-04 jrmu ;A numeric expression is one that does not
45 12687dd9 2023-08-04 jrmu ;require the use of variables for evaluation.
46 12687dd9 2023-08-04 jrmu ;(an expression that has no variables)
47 12687dd9 2023-08-04 jrmu ;
48 12687dd9 2023-08-04 jrmu ;A numeric expression is either
49 12687dd9 2023-08-04 jrmu ;1. a number or
50 12687dd9 2023-08-04 jrmu ;2. a structure (make-oper ne2 ne2) where make-oper
51 12687dd9 2023-08-04 jrmu ;corresponds to the make for the four different structures
52 12687dd9 2023-08-04 jrmu ;add, sub, mul, div (make-add, make-sub etc.) and ne1, ne2
53 12687dd9 2023-08-04 jrmu ;are numeric expressions.
54 12687dd9 2023-08-04 jrmu
55 12687dd9 2023-08-04 jrmu ;Template
56 12687dd9 2023-08-04 jrmu ;(define (fun-for-numeric a-data)
57 12687dd9 2023-08-04 jrmu ; (cond
58 12687dd9 2023-08-04 jrmu ; [(number? a-data) ...]
59 12687dd9 2023-08-04 jrmu ; [(add? a-data) ... (fun-for-numeric (add-left a-data)) ...
60 12687dd9 2023-08-04 jrmu ; ... (fun-for-numeric (add-right a-data)) ...]
61 12687dd9 2023-08-04 jrmu ; [(sub? a-data) ... (fun-for-numeric (sub-left a-data)) ...
62 12687dd9 2023-08-04 jrmu ; ... (fun-for-numeric (sub-right a-data)) ...]
63 12687dd9 2023-08-04 jrmu ; [(mul? a-data) ... (fun-for-numeric (mul-left a-data)) ...
64 12687dd9 2023-08-04 jrmu ; ... (fun-for-numeric (mul-right a-data)) ...]
65 12687dd9 2023-08-04 jrmu ; [(div? a-data) ... (fun-for-numeric (div-left a-data)) ...
66 12687dd9 2023-08-04 jrmu ; ... (fun-for-numeric (div-right a-data)) ...]))
67 12687dd9 2023-08-04 jrmu
68 12687dd9 2023-08-04 jrmu
69 12687dd9 2023-08-04 jrmu ;
70 12687dd9 2023-08-04 jrmu ;
71 12687dd9 2023-08-04 jrmu ;numeric? : SchemeData -> boolean
72 12687dd9 2023-08-04 jrmu ;Given a-data, determine if the expression it
73 12687dd9 2023-08-04 jrmu ;represents is numeric. That is,
74 12687dd9 2023-08-04 jrmu ;numeric? evaluates true if the SchemeData lacks symbols,
75 12687dd9 2023-08-04 jrmu ;which represents an expression which
76 12687dd9 2023-08-04 jrmu ;lacks variables.
77 12687dd9 2023-08-04 jrmu
78 12687dd9 2023-08-04 jrmu (define (numeric? a-data)
79 12687dd9 2023-08-04 jrmu (cond
80 12687dd9 2023-08-04 jrmu [(number? a-data) true]
81 12687dd9 2023-08-04 jrmu [(add? a-data) (and (numeric? (add-left a-data))
82 12687dd9 2023-08-04 jrmu (numeric?(add-right a-data)))]
83 12687dd9 2023-08-04 jrmu [(sub? a-data) (and (numeric? (sub-left a-data))
84 12687dd9 2023-08-04 jrmu (numeric? (sub-right a-data)))]
85 12687dd9 2023-08-04 jrmu [(mul? a-data) (and (numeric? (mul-left a-data))
86 12687dd9 2023-08-04 jrmu (numeric? (mul-right a-data)))]
87 12687dd9 2023-08-04 jrmu [(div? a-data) (and (numeric? (div-left a-data))
88 12687dd9 2023-08-04 jrmu (numeric? (div-right a-data)))]
89 12687dd9 2023-08-04 jrmu [else false]))
90 12687dd9 2023-08-04 jrmu
91 12687dd9 2023-08-04 jrmu ;
92 12687dd9 2023-08-04 jrmu ;
93 12687dd9 2023-08-04 jrmu ;evaluate-expression : SchemeData -> number
94 12687dd9 2023-08-04 jrmu ;Given a-data, evaluates the numeric expression it represents
95 12687dd9 2023-08-04 jrmu ;and returns the value.
96 12687dd9 2023-08-04 jrmu
97 12687dd9 2023-08-04 jrmu (define (evaluate-expression a-data)
98 12687dd9 2023-08-04 jrmu (cond
99 12687dd9 2023-08-04 jrmu [(number? a-data) a-data]
100 12687dd9 2023-08-04 jrmu [(add? a-data) (+ (evaluate-expression (add-left a-data))
101 12687dd9 2023-08-04 jrmu (evaluate-expression (add-right a-data)))]
102 12687dd9 2023-08-04 jrmu [(sub? a-data) (- (evaluate-expression (sub-left a-data))
103 12687dd9 2023-08-04 jrmu (evaluate-expression (sub-right a-data)))]
104 12687dd9 2023-08-04 jrmu [(mul? a-data) (* (evaluate-expression (mul-left a-data))
105 12687dd9 2023-08-04 jrmu (evaluate-expression (mul-right a-data)))]
106 12687dd9 2023-08-04 jrmu [(div? a-data) (/ (evaluate-expression (div-left a-data))
107 12687dd9 2023-08-04 jrmu (evaluate-expression (div-right a-data)))]))
108 12687dd9 2023-08-04 jrmu
109 12687dd9 2023-08-04 jrmu ;Examples
110 12687dd9 2023-08-04 jrmu ;(evaluate-expression 5)
111 12687dd9 2023-08-04 jrmu ;5
112 12687dd9 2023-08-04 jrmu ;(evaluate-expression (make-add 3 4))
113 12687dd9 2023-08-04 jrmu ;7
114 12687dd9 2023-08-04 jrmu ;(evaluate-expression (make-add (make-add 4 9) (make-add -2 4)))
115 12687dd9 2023-08-04 jrmu ;15
116 12687dd9 2023-08-04 jrmu ;(evaluate-expression (make-mul (make-add 4 5) (make-div 2 3)))
117 12687dd9 2023-08-04 jrmu ;(* 9 2/3)
118 12687dd9 2023-08-04 jrmu ;
119 12687dd9 2023-08-04 jrmu ;checked-evaluate-expression : SchemeData -> number
120 12687dd9 2023-08-04 jrmu ;Given a-data, check to see if the expression is numeric.
121 12687dd9 2023-08-04 jrmu ;If so, evaluate the expression. Return error if a-data
122 12687dd9 2023-08-04 jrmu ;is not numeric.
123 12687dd9 2023-08-04 jrmu
124 12687dd9 2023-08-04 jrmu (define (checked-evaluate-expression a-data)
125 12687dd9 2023-08-04 jrmu (cond
126 12687dd9 2023-08-04 jrmu [(numeric? a-data) (evaluate-expression a-data)]
127 12687dd9 2023-08-04 jrmu [else (error 'checked-evaluate-expression "expected arg: numeric expression")]))
128 12687dd9 2023-08-04 jrmu
129 12687dd9 2023-08-04 jrmu ;Test
130 12687dd9 2023-08-04 jrmu ;(checked-evaluate-expression (make-mul (make-add 9 4)
131 12687dd9 2023-08-04 jrmu ; (make-div (make-add 4 5) 2)))
132 12687dd9 2023-08-04 jrmu ;(* (+ 9 4)
133 12687dd9 2023-08-04 jrmu ; (/ (+ 4 5) 2))
134 12687dd9 2023-08-04 jrmu ;(checked-evaluate-expression (make-mul 4 'c))
135 12687dd9 2023-08-04 jrmu
136 12687dd9 2023-08-04 jrmu ;subst : symbol number SchemeData -> SchemeData
137 12687dd9 2023-08-04 jrmu ;Given the representation of a variable V (symbol),
138 12687dd9 2023-08-04 jrmu ;the number N, and a SchemeData which represents an expression,
139 12687dd9 2023-08-04 jrmu ;produce a new SchemeData representing an expression
140 12687dd9 2023-08-04 jrmu ;where all occurrences of the variable V (symbol)
141 12687dd9 2023-08-04 jrmu ;have been replaced with the number N.
142 12687dd9 2023-08-04 jrmu
143 12687dd9 2023-08-04 jrmu (define (subst V N a-data)
144 12687dd9 2023-08-04 jrmu (cond
145 12687dd9 2023-08-04 jrmu [(number? a-data) a-data]
146 12687dd9 2023-08-04 jrmu [(symbol? a-data) (cond
147 12687dd9 2023-08-04 jrmu [(symbol=? a-data V) N]
148 12687dd9 2023-08-04 jrmu [else a-data])]
149 12687dd9 2023-08-04 jrmu [(add? a-data) (make-add (subst V N (add-left a-data))
150 12687dd9 2023-08-04 jrmu (subst V N (add-right a-data)))]
151 12687dd9 2023-08-04 jrmu [(sub? a-data) (make-sub (subst V N (sub-left a-data))
152 12687dd9 2023-08-04 jrmu (subst V N (sub-right a-data)))]
153 12687dd9 2023-08-04 jrmu [(mul? a-data) (make-mul (subst V N (mul-left a-data))
154 12687dd9 2023-08-04 jrmu (subst V N (mul-right a-data)))]
155 12687dd9 2023-08-04 jrmu [(div? a-data) (make-div (subst V N (div-left a-data))
156 12687dd9 2023-08-04 jrmu (subst V N (div-right a-data)))]
157 12687dd9 2023-08-04 jrmu [else a-data]))
158 12687dd9 2023-08-04 jrmu ;Test
159 12687dd9 2023-08-04 jrmu (evaluate-expression (subst 'number 5 (make-add (make-mul (make-div 'number 4)
160 12687dd9 2023-08-04 jrmu (make-div 'number 2))
161 12687dd9 2023-08-04 jrmu (make-mul (make-sub 'number 2)
162 12687dd9 2023-08-04 jrmu (make-add 'number 3)))))
163 12687dd9 2023-08-04 jrmu (+ (* (/ 5 4)
164 12687dd9 2023-08-04 jrmu (/ 5 2))
165 12687dd9 2023-08-04 jrmu (* (- 5 2)
166 12687dd9 2023-08-04 jrmu (+ 5 3)))