150 likes | 290 Views
In this tutorial, we explore advanced data structures in Scheme, including symbols, pairs, and lists. We begin by discussing how to define symbols and their significance in binding names to specific values. Next, we introduce pairs using the `cons` function and demonstrate how to access their components with `car` and `cdr`. Finally, we define lists recursively and explain their representation in Scheme. This guide also covers techniques like association lists for key-value pairs and mutation of pairs using `set-car!` and `set-cdr!`. Enhance your understanding of Scheme data manipulation!
E N D
Structuring data • So far we’ve seen two types of values that we can bind to names: • numbers • Functions • Today we will see two more: • symbols • pairs
Symbols • A symbol is an unevaluated name. • Consider the following interaction: > (define x 12) > x 12 • The x in the define is not evaluated. It is a symbol. • The x in the second line is evaluated by looking up the value it is bound to in the current environment.
Using symbols • We can bind a name to a symbolic value by quoting the symbol – quoting prevents evaluation: > (define fifi 'poodle) > fifi poodle • The quote mark (') is syntactic sugar for the form (quote …); the above is equivalent to: > (define fifi (quote poodle))
Pairs • cons is a primitive function which builds a pair. • A pair has two members. • (cons 'a 'b) builds a pair • whose first member is the symbol a • whose second member is the symbol b • cons is therefore a pair constructor. • Graphically: a b
accessors • car returns the first member of a pair • cdr returns the second member of a pair > (define myPair (cons 'a 'b)) > (car myPair) a > (cdr myPair) b
How is a pair displayed? > (define myPair (cons 'a 'b)) > myPair (a . b) • Pairs are printed with a dot (.) separating the first (left) and second (right) components.
The REPL • When interacting with a Scheme system, a Read-Eval-Print Loop (REPL) reads what you type, evaluates it, prints the resulting value, and loops back to repeat. • The reader and printer parts of the REPL handle syntactic sugar (like converting 'a into (quote a)) and also printing things like lists.
Lists • What is a list? • A recursive definition: • the empty list () is a list • a pair whose cdr is a list is a list • We can build a list using cons and (): > (define myList (cons 'a '())) > myList (a)
Wait a minute!! > (define myPair (cons 'a 'b)) > myPair (a . b) > (define myList (cons 'a '()) > myList (a)
What's going on? • Why did myList print as (a) rather than as (a . ())? • In fact, they are entirely equivalent: the REPL strikes again. The printer formats pairs which cdr is a pair in a special way to make lists easier to read.
Printing lists • (a . (b . (c . (d . ())))) is printed as (a b c d) • Graphically the structure is: • This structure can be built in a variety of ways, some of which are shown on the next slide. a b c d
Choices…choices • (cons 'a (cons 'b (cons 'c (cons 'd '())))) • (list 'a 'b 'c 'd) • '(a b c d) • '(a . (b c d)) • (cons 'a (list 'b 'c 'd)) and so on!
Association lists • An association list is a list of pairs. • Used to implement a look-up table of key-value pairs. • The primitive assoc is used to search an association list, given a key. • Example on next slide.
> (define aList '((fifi . poodle) (fido . bulldog) (clifford . bigRed) (lassie . collie))) > (assoc 'fido aList) (fido . bulldog) > (assoc 'rufus aList) #f
Mutating pair components • set-car! mutates the value of the car of a pair • set-cdr! mutates the value of the cdr of a pair > (define myPair (cons 'a 'b)) > myPair (a . b) > (set-car! myPair 'fred) > myPair (fred . b) > (set-cdr! myPair 'wilma) > myPair (fred . wilma)