280 likes | 419 Views
Lecture 8: Con’s car cdr sdr wdr. David Evans http://www.cs.virginia.edu/~evans. CS200: Computer Science University of Virginia Computer Science. Menu. History of Scheme LISP Lists Sum. History of Scheme. Scheme [1975] Guy Steele and Gerry Sussman Originally “Schemer”
E N D
Lecture 8: Con’s car cdr sdr wdr David Evans http://www.cs.virginia.edu/~evans CS200: Computer Science University of Virginia Computer Science
Menu • History of Scheme • LISP • Lists • Sum CS 200 Spring 2002
History of Scheme • Scheme [1975] • Guy Steele and Gerry Sussman • Originally “Schemer” • “Conniver” [1973] and “Planner” [1967] • Based on LISP • John McCarthy (late 1950s) • Based on Lambda Calculus • Alonzo Church (1930s) • Last few lectures in course CS 200 Spring 2002
LISP “Lots of Insipid Silly Parentheses” “LISt Processing language” Lists are pretty important – hard to write a useful Scheme program without them. CS 200 Spring 2002
Making Lists CS 200 Spring 2002
Making a Pair > (cons 1 2) (1 . 2) 1 2 consconstructs a pair CS 200 Spring 2002
Splitting a Pair cons > (car (cons 1 2)) 1 > (cdr (cons 1 2)) 2 1 2 car cdr car extracts first part of a pair cdr extracts second part of a pair CS 200 Spring 2002
Why “car” and “cdr”? • Original (1950s) LISP on IBM 704 • Stored cons pairs in memory registers • car = “Contents of the Address part of the Register” • cdr = “Contents of the Decrement part of the Register” (“could-er”) • Doesn’t matters unless you have an IBM 704 • Think of them as first and rest (define first car) (define rest cdr) CS 200 Spring 2002
Implementing cons, car and cdr • Using PS2: (define cons make-point) (define car x-of-point) (define cdr y-of-point) • As we implemented make-point, etc.: (define (cons a b) (lambda (w) (if (w) a b))) (define (car pair) (pair #t) (define (cdr pair) (pair #f) CS 200 Spring 2002
Pairs are fine, but how do we make threesomes? CS 200 Spring 2002
Threesome? • (define (threesome a b c) • (lambda (w) • (if (= w 0) a (if (= w 1) b c)))) • (define (first t) (t 0)) • (define (second t) (t 1)) • (define (third t) (t 2)) Is there a better way of thinking about our triple? CS 200 Spring 2002
Triple • A triple is just a pair where one of the parts is a pair! (define (triple a b c) (cons a (cons b c))) (define (t-first t) (car t)) (define (t-second t) (car (cdr t))) (define (t-third t) (cdr (cdr t))) CS 200 Spring 2002
Quadruple • A quadruple is a pair where the second part is a triple (define (quadruple a b c d) (cons a (triple b c d))) (define (q-first q) (car q)) (define (q-second q) (t-first (cdr t))) (define (q-third t) (t-second (cdr t))) (define (q-fourth t) (t-third (cdr t))) CS 200 Spring 2002
Multuples • A quintuple is a pair where the second part is a quadruple • A sextuple is a pair where the second part is a quintuple • A septuple is a pair where the second part is a sextuple • An octuple is group of octupi • A list (any length tuple) is a pair where the second part is a …? CS 200 Spring 2002
Lists List ::= (consElementList) A list is a pair where the second part is a list. One little problem: how do we stop? This only allows infinitely long lists! CS 200 Spring 2002
From Lecture 6 Recursive Transition Networks ORNATE NOUN end begin NOUN ARTICLE ADJECTIVE ORNATE NOUN ::= ARTICLE ADJECTIVE NOUN ORNATE NOUN ::= ARTICLE ADJECTIVE ADJECTIVE NOUN ORNATE NOUN ::= ARTICLE ADJECTIVE ADJECTIVE ADJECTIVE NOUN ORNATE NOUN ::= ARTICLE ADJECTIVE ADJECTIVE ADJECTIVE ADJECTIVE NOUN ORNATE NOUN ::= ARTICLE ADJECTIVE ADJECTIVE ADJECTIVE ADJECTIVE ADJECTIVE NOUN CS 200 Spring 2002
Recursive Transition Networks ORNATE NOUN end begin NOUN ARTICLE ADJECTIVE ORNATE NOUN ::= ARTICLE ADJECTIVES NOUN ADJECTIVES ::= ADJECTIVE ADJECTIVES ADJECTIVES ::= CS 200 Spring 2002
Lists List ::= (consElementList) List ::= It’s hard to write this! A list is either: a pair where the second part is a list or, empty CS 200 Spring 2002
Null List ::= (consElementList) List ::= null A list is either: a pair where the second part is a list or, empty (null) CS 200 Spring 2002
List Examples > null () > (cons 1 null) (1) > (list? null) #t > (list? (cons 1 2)) #f > (list? (cons 1 null)) #t CS 200 Spring 2002
More List Examples > (list? (cons 1 (cons 2 null))) #t > (car (cons 1 (cons 2 null))) 1 > (cdr (cons 1 (cons 2 null))) (2) CS 200 Spring 2002
Sum CS 200 Spring 2002
Friday (sum n) = 1 + 2 + … + n (define (sum n) (for 1 n (lambda (acc i) (+ i acc)) 0)) (define (sum n) (for 1 n + 0)) Can we use lists to define sum? CS 200 Spring 2002
Sum (define (sum n) (insertl + (intsto n))) (intsto n) = (list 1 2 3 … n) (insertl + (list 1 2 3 … n)) = (+ 1 (+ 2 (+ 3 (+ … (+ n))))) CS 200 Spring 2002
Intsto (Dyzlexic implementation) ;;; Evaluates to the list (1 2 3 … n) if n >= 1, ;;; null if n = 0. (define (intsto n) (if (= n 0) null (cons n (intsto (- n 1))))) CS 200 Spring 2002
Intsto? ;;; Evaluates to the list (1 2 3 … n) if n >= 1, ;;; null if n = 0. (define (intsto n) (if (= n 0) null (list (intsto (- n 1)) n))) > (intsto 5) (((((() 1) 2) 3) 4) 5) CS 200 Spring 2002
Intsto ;;; Evaluates to the list (1 2 3 … n) if n >= 1, ;;; null if n = 0. (define (intsto n) (if (= n 0) null (append (intsto (- n 1)) (list n)))) append puts two lists together > (intsto 5) (1 2 3 4 5) CS 200 Spring 2002
Charge • PS3 Out Today • Uses Lists to make fractals • Due next week Wednesday • Next time: • We’ll define insertl • Try to do this yourself! (Easier than defining for) CS 200 Spring 2002