Written Learning Objectives for CIS352

The following learning objectives will be formally assessed via written (or typed) exam throughout the term of CIS352. Each learning objective will be turned into a written exam question which students will have the opportunity to complete during quizzes / final.

The student must be able to…

  1. Identify expressions, forms, and callsites (in Racket).
  2. Implement traditional recursive algorithms in direct style using numbers, lists, and conditionals.
  3. Differentiate tail calls (and tail recursion) vs. direct-style calls; be able to implement tail-recursive list accumulation algorithms.
  4. Draw cons diagrams for arbitrary tree-shaped (Racket) data and (at a high level) explain its relation to layout in RAM / cache.
  5. Use (and define) maps over lists and tree-shaped data.
  6. Use (and define) folds (such as foldl/foldr) to accumulate results of traversals over lists.
  7. Perform common (beta, alpha, eta) reductions / conversions for the lambda calculus; evaluate lambda calculus terms to normal form using various reduction strategies, including call-by-name/value.
  8. Construct a metacircular interpreter for small, core languages (such as the lambda calculus)
  9. Perform Church encoding to translate higher-level program constructs (variable-arity lambdas, `let`-binding, recursion) to the lambda calculus. Specifically, be able to use the U and Y combinators to implement recursion.
  10. Explain the execution of code written with `call/cc` (i.e., full, undelimited continuations). Have an idea of how `call/cc` may be used to implement control constructs such as preemptive returns, exceptions, and loops.
  11. Explain the key passes involved in a compiler from a simple high-level language to assembly.