---------------------------------------- Tutorial notes #1 for 2/12 or 2/13/2007 TA: Stephen McCamant Email: smcc@mit.edu Location: 36-113A or 36-115 ---------------------------------------- * About me * About you ---------------------------------------- Scheme evaluation rules: 1. If it's self-evaluating (e.g. number), return value 2. If it's a name (e.g., x, +), look up in environment and return associated value 3. If it's a special form: a. define: evaluate 2nd arg, bind 1st to that value b. lambda: return procedure c. if: evaluate 1st arg; if not #f, eval 2nd, else eval 3rd. 4. If it's a combination: a. Evaluate each subexpression b. Apply 1st to rest 1. If primitive, just do it 2. If compound procedure, replace formal parameters with actual arguments and evaluate ---------------------------------------- DrScheme basics ---------------------------------------- Examples: define and simple expressions 12 ;-> 12 (+ 12 18) ;-> 30 (* 1 2 3 4 5) ;-> 120 (*) ;-> 1 (+ (* 2 3) (* 4 5)) ;-> 26 (+ 1 (+ 2 (+ 3 (+ 4 5)))) ;-> 15 ((+ 1 2)) ;-> error: expected procedure, got 3 (define pi 3.14) ;-> unspecified (* 2 pi) ;-> 6.28 (- 10) ;-> -10 (/ 5) ;-> 1/5 (/ 5.0) ;-> 0.2 (define e (+ 1.0 (/ 1) (/ 2) (/ 6) (/ 24) (/ 120) (/ 720))) ;-> unspecified e ;-> 2.71805 (define x x) ;-> error (define x 2) ;-> unspecified (define x x) ;-> unspecified (+ x x) ;-> 4 ---------------------------------------- Examples: lambda (lambda (x) x) ;-> procedure (lambda () 5) ;-> procedure ((lambda (x y) (+ x y)) 2 3) ;-> 5 ((lambda () 42)) ;-> (define square (lambda (x) (* x x))) ;-> unspecified (square 5) ;-> 25 (square (square 3)) ;-> 81 ((lambda (x y) x) 1 2) ;-> 1 (/ 0 0) ;-> error (* 0 (/ 0 0)) ;-> error ((lambda (x y) x) 1 (/ 0 0)) ;-> error Examples: if (if #t 2 3) ;-> 2 (if #f 2 3) ;-> 3 (= 2 2) ;-> #t (< 2 3) ;-> #t (<= 2 2) ;-> #t (if (< 12 10) 12 10) ;-> 10 (+ 10 (if (< 12 10) 2 0)) ;-> 10 (define x 2) (if (< x 10) (if (< x 5) 0 5) (if (< x 15) 10 15)) ;-> 0 ((if (< x 10) + *) 2 3) ;-> 5 (if #t 5 (/ 0)) ;-> 5 ---------------------------------------- (cond (condition1 value1) (condition2 value2) (condition3 value3) (else value4)) Is "cond" syntactic sugar or a special form? Yes, both. It's syntactic sugar because it can be rewritten using just "if": (if condition1 value1 (if condition2 value2 (if condition3 value3 value4))) It's a special form because it doesn't follow the usual rules for evaluation of combinations; not all of the subexpressions are evaluated, condition1 isn't applied as a procedure to value1, etc. (or (< 2 3) (<= 2 3)) ;-> #t Write these functions: (celsius-to-farenheit 0) -> 32 (celsius-to-farenheit 100) -> 212 (celsius-to-farenheit 37.0) -> 98.6 ;; F = 32 + (9/5)*C (define celsius-to-farenheit (lambda (c) (+ 32 (* (/ 9 5) c)))) (feet-to-meters 6) -> 1.8288 ;; one inch is 2.54 centimeters ;; one foot is 12 inches ;; Using helper functions here makes it easier to make sure you've ;; got all the parts right. (define feet-to-inches (lambda (f) (* f 12))) (define inches-to-centimeters (lambda (i) (* i 2.54))) (define centimeters-to-meters (lambda (c) (/ c 100))) (define feet-to-meters (lambda (f) (centimeters-to-meters (inches-to-centimeters (feet-to-inches f))))) (hamburger-price <patties> <cheese?>) ;; a single burger is $1.19 ;; a double burger is $1.69 ;; a triple burger is $1.99 ;; cheese is 20 cents extra (define hamburger-price (lambda (patties cheese) (+ (if cheese 0.20 0) (cond ((= patties 1) 1.19) ((= patties 2) 1.69) ((= patties 3) 1.99) (else (error "Heart attack")))))) ;; (cos x) computes the cosine of x in ;; radians. ;; Write a function to find a value x ;; such that cos(x) = x. ;; Note that we're relying on the fact that inexact Scheme numbers ;; have a finite precision; otherwise this wouldn't stop. (define cos-fixed-point (lambda (x) (if (= x (cos x)) x (cos-fixed-point (cos x))))) (donut-price <quantity>) ;; Donuts are 79 cents each, ;; or $3.99 for 6, or ;; $7.49 per dozen. What's the ;; best price for n donuts? (define donut-price (lambda (n) (cond ((>= n 12) (+ 7.49 (donut-price (- n 12)))) ((= n 11) (donut-price 12)) ;; cheaper by the dozen ((>= n 6) (+ 3.99 (donut-price (- n 6)))) ((>= n 0) (* n 0.79)) (else (error "We can't sell that many donuts")))))