- A variable binding
- The semantics - Syntax is just how you write something - Semantics is what that something means - Type-checking (before program runs) - Evaluation (as program runs)
- Expressions
- Variables
- Conditional Expression
- Function definitions
- Recursion
- Function bindings
- Function Calls
- Functions as Parameters
- Tuples and lists
- Pairs (2-tuples)
- Nesting
- Building Lists
- Accessing Lists
- Type-checking list operations
- Let-expressions
- Options
- Syntactic sugar
- Records
- Datatypes
- Datatype bindings
- Case
- Patterns
- Expression Trees
- Recursion
- Recursive datatypes
- Options are datatypes
- Lists are datatypes
- Case Expressions
- pattern-matching
- Each-of types
- Val-binding patterns
- Function-argument patterns
- Nested patterns
- Exceptions
- Call-stacks
- Moral of tail recursion
- First-class functions
- Function Closures
- Functions as arguments
- Relation to types
- Polymorphism and higher-order functions
- Anonymous functions
- Map
- Filter
- Generalizing
- Returning functions
- Type Generality
- Subtype
- Recomputation
- Another famous function: Fold
- Combine functions
- Currying
- Curried fold
- Unnecessary function wrapping
- Iterators
- References
- Callbacks
- Mutable state
- Library implementation
- Clients
- Implementing an ADT
- Modules
- Namespace management
- Signatures
- Hiding things
- Hiding with functions
- Library spec and invariants
- Abstract types
- Signature matching
- Equivalent implementations