Skip to content

Commit e78a510

Browse files
committed
add ex-2.58-a.rkt
1 parent 29397ab commit e78a510

File tree

1 file changed

+64
-0
lines changed

1 file changed

+64
-0
lines changed

SICP/chapter-02/ex-2.58-a.rkt

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
#lang sicp
2+
3+
(define (deriv exp var)
4+
(cond ((number? exp) 0)
5+
((variable? exp)
6+
(if (same-variable? exp var) 1 0))
7+
((sum? exp)
8+
(make-sum (deriv (addend exp) var)
9+
(deriv (augend exp) var)))
10+
((product? exp)
11+
(make-sum
12+
(make-product (multiplier exp)
13+
(deriv (multiplicand exp) var))
14+
(make-product (deriv (multiplier exp) var)
15+
(multiplicand exp))))
16+
(else
17+
(error "unknown expression type -- DERIV" exp))))
18+
19+
(define (variable? x) (symbol? x))
20+
21+
(define (same-variable? v1 v2)
22+
(and (variable? v1) (variable? v2) (eq? v1 v2)))
23+
24+
(define (make-sum a1 a2)
25+
(cond ((=number? a1 0) a2)
26+
((=number? a2 0) a1)
27+
((and (number? a1) (number? a2)) (+ a1 a2))
28+
(else (list a1 '+ a2))))
29+
30+
(define (=number? exp num)
31+
(and (number? exp) (= exp num)))
32+
33+
(define (make-product m1 m2)
34+
(cond ((or (=number? m1 0)
35+
(=number? m2 0))
36+
0)
37+
((=number? m1 1) m2)
38+
((=number? m2 1) m1)
39+
((and (number? m1) (number? m2))
40+
(* m1 m2))
41+
(else (list m1 '* m2))))
42+
43+
(define (sum? x)
44+
(and (pair? x) (eq? (cadr x) '+)))
45+
46+
(define (addend s) (car s))
47+
48+
(define (augend s) (caddr s))
49+
50+
(define (product? x)
51+
(and (pair? x) (eq? (cadr x) '*)))
52+
53+
(define (multiplier p) (car p))
54+
55+
(define (multiplicand p) (caddr p))
56+
57+
;; (display (deriv '(+ x 3) 'x))
58+
;; (newline)
59+
;; (display (deriv '(* x y) 'x))
60+
;; (newline)
61+
;; (display (deriv '(* (* x y) (+ x 3)) 'x))
62+
;; (newline)
63+
(display (deriv '(x + (3 * (x + (y + 2)))) 'x))
64+

0 commit comments

Comments
 (0)