Things to know for Programming Concepts final:

Stuff in RED was not covered in 2013 and therefore not on the final.

Functions
* Domain (input)
* Range (output)
* If x is in the domain of a function f, and y is in the range 
  with y = f(x), then (f x) in Scheme code will ALWAYS return y.

Special forms (not functions; rules for application may not follow
the mathematical definition of functions)
* define
* if
* cond
* quote (means "take literally" or "do not evaluate")
* lambda
* let (a lambda that is immediately executed; nice for simplifying code)
* * Example: ((lambda (x y) (+ x y)) 1 2) 
* *           is the EXACT SAME THING as
* *          (let ((x 1) (y 2)) (+ x y))

Lambda (unnamed function)
* Behaves EXACTLY like a defined function except that it has no name

Substitution Model
* Tell us that if we have parameters in a function (say, x and y), and if
  those parameters are bound to values (say 1 and 6), then everywhere you
  see an x you can replace it with a 1 and everywhere you see a y you can
  replace it with a 6.  This makes it a lot easier to analyze a function
  and to show your work when analyzing a function.

Abstractions (produce abstract data types (ADT))
* Constructors
* Selectors (sometimes called accessors)
* Predicates (selectors for asking questions)
* Mutators (sometimes called modifiers; NOT used in this class)
* Constants

Word ADT
* Constructors
* * word
* Selectors
* * first
* * butfirst/bf
* * last
* * butlast/bl
* * item (starts at 1)
* * count
* Predicates
* * empty?
* * word?
* Constants
* * "" (the empty word)

Sentence ADT
* Constructors
* * sentence/se
* Selectors
* * first
* * butfirst/bf
* * last
* * butlast/bl
* * item (starts at 1)
* * count
* Predicates
* * empty?
* * sentence?
* Constants
* * () or '() (the empty sentence)

HOFs for words and sentences
* every
* keep
* accumulate

List ADT (standard Scheme)
* Constructors
* * cons
* * list
* * append
* Selectors
* * car
* * cdr
* * cxr (where x is replaced by up to four a/d letters;
* *   note that the letters are processed right to left:
* *   (cadddr l) does three cdrs and then a car
* * list-ref (starts at 0)
* * length
* Predicates
* * null?
* * pair?
* * list?
* Constants
* * () or '() (the empty list)

HOFs for lists
* map
* filter
* reduce

HOFs for everything
* repeated

User Input
* read
* read-line

Tree ADT
* Constructors
* * make-node
* Selectors
* * datum
* * children
* Predicates
* * leaf? (defined in book; not given as part of simply.scm)
* * empty-tree? (discussed in class)
* Constants
* * the-empty-tree not pre-defined, you have to do it yourself and make
* * it consistent with the empty-tree? predicate (discussed in class)

Binary search tree (BST) ADT
* Constructors
* * make-node
* Selectors
* * datum
* * left
* * right
* Predicates
* * leaf?
* * empty-tree?
* Constants
* * the-empty-tree not pre-defined, you have to do it yourself and make
* * it consistent with the empty-tree? predicate (discussed in class)

Recursion
* A recursive function is a function that calls itself
* For a recursive function to work, it MUST include two things:
* * At least one base case
* * At least one recursive call
* Recursive functions work by calling themselves with inputs that
* get progressively smaller in size
* Example:
* * (define (factorial x)
* *    (cond ((= x 1) 1)
* *          (else (* x (factorial (- x 1))))))
* Usage:
* * (factorial 3) becomes
* * (* 3 (factorial 2)) becomes
* * (* 3 (* 2 (factorial 1))) becomes
* * (* 3 (* 2 1)) becomes
* * (* 3 2) becomes
* * 6
* Note how the inputs to factorial are 3 then 2 then 1...
* They decrease as the function gets closer to the solution