Transcript slides

Lecture 8:
Con’s car cdr sdr wdr
CS200: Computer Science
University of Virginia
Computer Science
David Evans
http://www.cs.virginia.edu/~evans
Menu
• History of Scheme
–LISP
• Lists
• Sum
4 February 2002
CS 200 Spring 2002
2
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
4 February 2002
CS 200 Spring 2002
3
LISP
“Lots of Insipid Silly Parentheses”
“LISt Processing language”
Lists are pretty important – hard to
write a useful Scheme program
without them.
4 February 2002
CS 200 Spring 2002
4
Making Lists
4 February 2002
CS 200 Spring 2002
5
Making a Pair
> (cons 1 2)
(1 . 2)
1 2
cons constructs a pair
4 February 2002
CS 200 Spring 2002
6
Splitting a Pair
> (car (cons 1 2))
1
> (cdr (cons 1 2))
2
cons
1 2
car
cdr
car extracts first part of a pair
cdr extracts second part of a pair
4 February 2002
CS 200 Spring 2002
7
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)
4 February 2002
CS 200 Spring 2002
8
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)
4 February 2002
CS 200 Spring 2002
9
Pairs are fine, but how do
we make threesomes?
4 February 2002
CS 200 Spring 2002
10
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?
4 February 2002
CS 200 Spring 2002
11
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)))
4 February 2002
CS 200 Spring 2002
12
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)))
4 February 2002
CS 200 Spring 2002
13
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 …?
4 February 2002
CS 200 Spring 2002
14
Lists
List ::= (cons Element List)
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!
4 February 2002
CS 200 Spring 2002
15
From Lecture 6
Recursive Transition Networks
ORNATE NOUN
begin
ARTICLE
ADJECTIVE
NOUN
end
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
4 February 2002
CS 200 Spring 2002
16
Recursive Transition Networks
ORNATE NOUN
begin
ARTICLE
ADJECTIVE
NOUN
end
ORNATE NOUN ::= ARTICLE ADJECTIVES NOUN
ADJECTIVES
::= ADJECTIVE ADJECTIVES
ADJECTIVES
::=
4 February 2002
CS 200 Spring 2002
17
Lists
List ::= (cons Element List)
List ::=
It’s hard to write this!
A list is either:
a pair where the second part is a list
or, empty
4 February 2002
CS 200 Spring 2002
18
Null
List ::= (cons Element List)
List ::= null
A list is either:
a pair where the second part is a list
or, empty (null)
4 February 2002
CS 200 Spring 2002
19
List Examples
> null
()
> (cons 1 null)
(1)
> (list? null)
#t
> (list? (cons 1 2))
#f
> (list? (cons 1 null))
#t
4 February 2002
CS 200 Spring 2002
20
More List Examples
> (list? (cons 1 (cons 2 null)))
#t
> (car (cons 1 (cons 2 null)))
1
> (cdr (cons 1 (cons 2 null)))
(2)
4 February 2002
CS 200 Spring 2002
21
Sum
4 February 2002
CS 200 Spring 2002
22
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?
4 February 2002
CS 200 Spring 2002
23
Sum
(define (sum n)
(insertl + (intsto n)))
(intsto n) = (list 1 2 3 … n)
(insertl + (list 1 2 3 … n)) =
(+ 1 (+ 2 (+ 3 (+ … (+ n)))))
4 February 2002
CS 200 Spring 2002
24
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)))))
4 February 2002
CS 200 Spring 2002
25
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)
4 February 2002
CS 200 Spring 2002
26
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)
4 February 2002
CS 200 Spring 2002
27
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)
4 February 2002
CS 200 Spring 2002
28