EBoard 09 (Section 1): Lists, Continued

Approximate overview

  • Administrative stuff [~10 min]
  • Questions [?? min]
  • Lab [Approximately 60 min]

Administrivia

Reminders

  • Please say your name when you ask or answer a question (even if I’ve just called you by name).
  • Evening tutors are available 7–10 p.m. Sunday through Thursday as well as 3–5 p.m. on Sunday.
  • Mentor sessions are Wednesday, 8–9 p.m., Sunday 4–5 p.m., Monday 8–9 p.m.
    • No Mentor Session next Wednesday (SoLA 1)

Introductory notes

  • Happy Valentine’s Day! I care about you all (in a non-romantic way).
  • I accomplished less than I had planned this weekend. Stay tuned for grading and such.

Racket notes

Here’s one version of the code from last lab.

(define string->integer
  (lambda (str)
    (apply +
           (map *
                (string->digits str)
                (reverse (map (section expt 10 <>) 
                              (range (string-length str))))))))

People who have programmed before tend to want to use string-ref or list-ref and try to deal with the characters individually. One nice things about Scheme (and most functional languages) is that you can process the digits en masse.

Upcoming work

  • Readings for Wednesday due Tuesday at 10:00 p.m.
  • Lab writeup from today due Tuesday at 10:30 p.m.
    • Let’s hope we can finish in class today.
  • SoLA 1 to be released Wednesday at 2:30 p.m.
    It is due Thursday at 10:30 p.m.
  • Quiz 4 Friday: Style
  • Mini-Project 1 redo due Sunday the 20th at 10:30 p.m. (sooner is better)
  • Mini-Project 2 redo due Sunday the 27th at 10:30 p.m. (sooner is better)

Upcoming Token-Generating Activities

  • Mentor sessions.
  • CS Study Break, Tuesday, 8:30pm, CS Commons.
  • Visit the current exhibit in the Grinnell Art Museum. (At least 15 min.)

Other Upcoming Activities

  • Neuroscience Journal Club, Thursday, February 17, Noon, Noyce 2517.

Being more efficient

I’ve included the ideas from Friday’s email. You should think/pair/be ready to share about others.

In readings

  • Acknowledge that it’s okay if you don’t completely understand the reading or the procedures mentioned in the reading. We do the labs to help you figure things out better.
    • Aka “Cut your losses”.
    • Aka “Understand the learning curve”.
  • Take notes as you go.
    • Including pointers to things (i.e., find out more about X in ….)
    • Try things out in DrRacket.
    • Including variants of what we do.
  • After you finish each reading, write a one-minute summary of the key points.
  • Do the self checks.
  • Get familiar with Racket documentation.

In mini-projects

  • Start early. There’s some evidence that our subconscious sometimes helps us solve computational problems.
  • Keep a list of potentially helpful procedures at hand.
    • Racket procedures you’ve learned and might use.
    • Procedures you’ve written
      • You might use them directly
      • You might use them as an example of how to solve certain problems
  • Don’t be afraid to experiment.
  • Don’t spend too much time stuck. If you struggle on a problem for more than five minutes, ask a question. If you won’t get the answer immediately (e.g., if it’s on Teams), move on to the next problem. [+1]
  • It helps to work in 3813/3815, since there are often folks around who might help.
  • Other ways to get unstuck.
    • Reread the assignment/problem.
    • Check the Q&A channel for ideas.
  • Accept that you might have to re-do parts of the mini-project to achieve the grade you’d like.
  • Consider submitting your code early to see potential issues.

Questions

From the readings (not discussing)

In the first reading, the result of (flah 0+6i) is 0-1/3i. Why is the result not 0+1/3i?

(1/3)*i + 6*i = 2*i*i. i*i = -1. So (6*i)/2 = -1/3*i.

Why would you use ‘o’ instead of section if the parameters for ‘o’ can only be things like add1 sub1 etc. whereas with section you can use - + and *?

Sometimes we’ll have procedures that naturally compose, such as in the string-reverse example (which we can’t do with section).

From the readings (discussing)

How are anonymous procedures useful?

Anonymous procedures are useful when you need a “one off” procedure that you don’t feel like naming.

“I want all the grades between 80 and 90 (inclusive).”

    (define b-grade?
      (lambda (grade)
        (<= 80 grade 90)))
    (filter b-grade? grades)

    ; vs

    (filter (lambda (grade) (<= 80 grade 90))
            grades)

    ; vs

    (filter (section <= 80 <> 90) grades)

Could you go over section a bit more?

section creates a new procedure by “filling in” one or more of the parameters of another procedure (as in the third example above).

It’s useful as a shorthand for exactly those situations when you find yourself writing something like

    (define proc
      (lambda (params)
        (other-proc constant params)))

Some people find it more like English

Why don’t you have a one-character equivalent for section like you have for compose and lambda?

I haven’t found a good one. Any suggestions?

Other questions

Lab

Preliminaries

  • I do not anticipate dropping any problems from today’s lab.

During Lab

  • “Three-parameter map”. (map + '(1 2 3) '(4 4 4)) -> '(5 6 7)
  • When you get to party-person, just write it the way that you would have written it last week.

      (define party-person
        (lambda (scale)
          (above (triangle (* scale 20) 'solid 'green)
                 ...)))
    
  • Note: reduce works better with two-parameter procedures, apply works better with procedures that take an arbitrary number of parameters.

Wrapup

  • Submit exercises 1–3. Do exercise 4 on your own, do not submit it, but be prepared to discuss it in class.
    • “discuss it in class”: Sam will ask you questions or you can ask Sam questions.