Potential midterm exam topics (and study checklist)
General Concepts
- types:
   
   - static vs. dynamic typing
 
   - type safety
 
   - type inference
 
   - polymorphism
 
   - overloading
 
   - coercion
 
   
    
- functional vs. imperative languages; functional subset of language
 
- higher-order functions
 
- closures
 
- equality vs. identity (and when it matters)
 
- lexical vs. dynamic scoping
 
- compile time vs. run time
 
- recursion; tail recursion
 
Racket
- constructing and navigating list structures
 
- scoping issues (lexical scoping, global variables, parameters, let,
let*, letrec, environments)
 
- function definition; anonymous functions; special forms
 
- recursion; tail recursion
 
- eval and apply
 
- delayed evaluation
 
- programs as data
 
- side effects in Racket
 
- simulating objects in Racket
 
- Racket macros; macro hygiene
 
- functions with variable number of arguments; improper lists
 
Haskell
- functions, including higher-order functions, currying, and 
anonymous functions
 
- lexical scoping
 
- types: polymorphic types; type inference, declarations;
  user-defined types, including recursive types; type classes; inheritance
 
- referential transparency
 
- lazy evaluation; infinite data structures
 
- pattern matching
 
- list comprehensions
 
- monads; I/O in Haskell
 
- correct Haskell vocabulary (For example, "do" in Haskell defines a
  block.  Haskell does not have loops, assignments, or statements.)
 
- the Octopus interpreter (especially which environment is used where,
 and how Racket data is represented)