diff --git a/ex-2_53-xx.scm b/ex-2_53-xx.scm index e69de29..e2500df 100644 --- a/ex-2_53-xx.scm +++ b/ex-2_53-xx.scm @@ -0,0 +1,113 @@ +(load "util.scm") + +(define (memq item x) + (cond ((null? x) false) + ((eq? item (car x)) x) + (else (memq item (cdr x))))) + +(display "ex-2.53 - symbols (see comments)") (newline) + +(list 'a 'b 'c) ; (a b c) +(list (list 'george)) ; ((george)) +(cdr '((x1 x2) (y1 y2))) ; ((y1 y2)) +(cadr '((x1 x2) (y1 y2))) ; (y1 y2) +(pair? (car '(a short list))) ; #f +(memq 'red '((red shoes) (blue socks))) ; #f +(memq 'red '(red shoes blue socks)) ; (red shoes blue socks) +(newline) + +(display "ex-2.54 - equal?") (newline) + +(define (my-equal? a b) + (cond + ((and (null? a) (null? b)) #t) + ((eq? (car a) (car b)) (my-equal? (cdr a) (cdr b))) + (else #f))) + +(assert (my-equal? '(this is a list) '(this is a list)) #t) +(assert (my-equal? '(this is a list) '(this (is a) list)) #f) +(newline) + +(display "ex-2.55 - double quote") (newline) + +; The expression after car yields `(quote abracadabra)`. Consequently car +; returns `quote`. +(display (car ''abracadabra)) + +(newline) (newline) +(display "example - symbolic differentiation\n") + +(define (variable? x) (symbol? x)) +(define (same-variable? v1 v2) + (and (variable? v1) (variable? v2) (eq? v1 v2))) +(define (=number? exp num) + (and (number? exp) (= exp num))) +(define (make-sum a1 a2) + (cond ((=number? a1 0) a2) + ((=number? a2 0) a1) + ((and (number? a1) (number? a2)) (+ a1 a2)) + (else (list '+ a1 a2)))) +(define (make-product m1 m2) + (cond ((or (=number? m1 0) (=number? m2 0)) 0) + ((=number? m1 1) m2) + ((=number? m2 1) m1) + ((and (number? m1) (number? m2)) (* m1 m2)) + (else (list '* m1 m2)))) + +(define (sum? x) + (and (pair? x) (eq? (car x) '+))) +(define (addend s) (cadr s)) +(define (augend s) (caddr s)) +(define (product? x) + (and (pair? x) (eq? (car x) '*))) +(define multiplier cadr) +(define multiplicand caddr) + +(define (deriv exp var) + (cond ((number? exp) 0) + ((variable? exp) + (if (same-variable? exp var) 1 0)) + ((sum? exp) + (make-sum (deriv (addend exp) var) + (deriv (augend exp) var))) + ((product? exp) + (make-sum + (make-product (multiplier exp) + (deriv (multiplicand exp) var)) + (make-product (deriv (multiplier exp) var) + (multiplicand exp)))) + ((exponentiation? exp) + (let ((b (base exp)) + (e (exponent exp))) + (make-product + (make-product e (make-exponentiation b (make-sum e -1))) + (deriv b var)))) + (else + (error "unknown expression type -- DERIV" exp)))) + +(display (deriv '(+ x 3) 'x)) (newline) ; (+ 1 0) +(display (deriv '(* x y) 'x)) (newline) ; (+ (* x 0) (* 1 y)) +(display (deriv '(* (* x y) (+ x 3)) 'x)) +;(+ (* (* x y) (+ 1 0)) +; (* (+ (* x 0) (* 1 y)) +; (+ x 3))) + + +(display "\n\nex-2.56\n") + +(define (exponentiation? x) (and (pair? x) (eq? (car x) '**))) +(define base cadr) +(define exponent caddr) +(define (make-exponentiation b e) + (cond + ((=number? e 0) 1) + ((=number? e 1) b) + (else (list '** b e)))) +; Also extended deriv above. + +(display (deriv (make-exponentiation 'x 3) 'x)) + + +(display "\n\nex-2.57") (newline) + +(display "\n\nex-2.58") (newline)