Approximate overview
Note: For mentor sessions, I’d like reflections and not just “this is what we did.
Write programs that produce unpredictable output.
Grinnell has suggested that we make up “random ids” for the students in our classes that we can use in online platforms.
Write a procedure, (random-id), that creates a string consisting of a random six-letter identifier of the form consonant-vowel-consonant-vowel-consonant-vowel, with all letters uppercase.
> (random-id)
"PALEQO"
> (random-id)
"ZEDUMI"
Isn’t that fun?
One of the points of the int-list->string exercise was that printing
of lists is optimistic in Racket. We assume we have a list until
proven otherwise.
We’ll use a local helper rather than the separate procedure. To
define local recursive helpers, we use letrec rather than `let.
(The reason is complicated.)
I’m using a local helper to make it easier to change things, since
that means I don’t have to rename it when I make a new procedure
like int-list->string.
I’m using cond rather than if because I expect to add more cases.
(define int-list->string
(letrec ([; helper is used for all but the car; it add spaces and values
helper
(lambda (val)
(cond
[(null? val)
""]
[else
(string-append " "
(number->string (car val))
(helper (cdr val)))]))])
(lambda (val)
(cond
[(null? val)
"()"]
[else
(string-append "("
(number->string (car val))
(helper (cdr val))
")")]))))
Next version: Add support for a dot at the end.
; What if the pair structure does not end in null? What would you
; change in this code?
(define int-listish->string
(letrec ([; helper is used for all but the car; it add spaces and values
helper
(lambda (val)
(cond
[(null? val)
""]
[(number? val) ; ADDED
(string-append " . " (number->string val))] ; ADDED
[else
(string-append " "
(number->string (car val))
(helper (cdr val)))]))])
(lambda (val)
(cond
[(null? val)
"()"]
[else
(string-append "("
(number->string (car val))
(helper (cdr val))
")")]))))
Minor update: Allow it to handle integers as well as lists of integers.
(define int-thing->string
(letrec ([; helper is used for all but the car; it add spaces and values
helper
(lambda (val)
(cond
[(null? val)
""]
[(number? val)
(string-append " . " (number->string val))]
[else
(string-append " "
(number->string (car val))
(helper (cdr val)))]))])
(lambda (val)
(cond
[(null? val)
"()"]
[(number? val)
(number->string val)]
[else
(string-append "("
(number->string (car val))
(helper (cdr val))
")")]))))
Next variant: Add support for nested structures.
(define int-thing->string
(letrec ([; helper is used for all but the car; it add spaces and values
helper
(lambda (val)
(cond
[(null? val)
""]
[(number? val)
(string-append " . " (number->string val))]
[else
(string-append " "
(int-thing->string (car val))
(helper (cdr val)))]))])
(lambda (val)
(cond
[(null? val)
"()"]
[(number? val)
(number->string val)]
[else
(string-append "("
(int-thing->string (car val))
(helper (cdr val))
")")]))))
What are the differences between lists, vectors, and pairs?
Lists and pairs are (effectively) immutable, most vectors are mutable. Mutation causes confusion. (But it’s also really useful.)
However, it’s easy to extend a list; just cons something on the front.
Vectors are a fixed size; they cannot easily be extended. You must build a new vector that is larger and then copy over all the elements.
Similarly, throwing away the first element of a list is easy; take the cdr.
Throwing away the first element of a vector requires building a new vector. (Vectors are fixed size).
Pairs exist primarily to allow you to build lists efficiently.
Why did we use lists and pairs?
Immutability is easier conceptually.
It’s nice to grow things (or shrink).
When are the redos for MP3 and MP4 happening?
After break. Probably two weeks after break (April 17).
vectors.rktSee the board for the memory model.
Core idea: We are randomly looking in a list or vector of size size.
We look in that list or vector rounds times. (Each individual -ref
is too fast to measure, so we do it again and again and again to make
it easier to measure.)
We want to determine whether and how much the size of the list or vector affects the overall/average time for lookup.
We’ll discuss results next time.