Major concepts, language by language
- Scheme
- Lists and list operations. Lexical scope and closures. Symbolic manipulation. Procedures and data as lists. First-class functions.
- Perl
- Regular expressions. String manipulation. Scripting as a style of programming.
- Java and Smalltalk
- Object-oriented concepts: information hiding, encapsulation (access protection), inheritance, polymorphism, dynamic dispatch. Portability via virtual machines (bytecode, in the case of Java). OO type systems and F-bounded polymorphism.
- Miranda
- Algebraic types. Pattern matching on arguments. Currying and higher-order functions. Universal (Milner) polymorphism.
- CLP(R)
- Constraints, rules, derivation trees, etc. (The past two weeks.)
- Non-language-specific
- Static vs. dynamic typing. Scoping and visibility. Parameter-passing mechanisms (value, result, value-result, reference, name, "pass by constraint"). Lazy vs. greedy evaluation.
Further study
If you like languages, there are lots of directions that we haven't explored yet in this course. Here are some things that we haven't done:
- Aspect-oriented programming: "Provide programming language support for code that cross-cuts modules." http://www.aspectj.org provides a semi-accessible introduction.
- Multi-dispatch languages: CLOS (Common Lisp Object System) and Cecil (a UW project) both offer the capability for message dispatching on the types of multiple arguments, not just the receiver.
- Kaleidoscope: Alan's research project, which created a fully constraint-based object system.
- More functional languages: ML and Haskell are the major functional languages, non-pure and pure respectively, that people might expect you to have heard of.
- Scripting languages: Python and Ruby are both in the Perl vein, but cleaner.
Most languages have free implementations. If you're curious, download and play around with a language sometime.