## Recommended Software ##
During the course, we'll be encouraging you to try out various things in Scheme
-and Caml, which are prominent *functional programming languages*. We'll explain
-what that means during the course.
+and OCaml. Occasionally we will also make remarks about Haskell. All three of these
+are prominent *functional programming languages*. The term "functional" here means they have
+a special concern with functions, not just that they aren't broken. But what precisely is
+meant by "functional" is somewhat fuzzy and even its various precisifications take some
+time to explain. We'll get clearer on this during the course. Another term used roughly the same as "functional"
+is "declarative." At a first pass, "functional" or "declarative" programming is primarily focused on complex
+expressions that get computationally evaluated to some (usually simpler) result. In class I gave the examples
+of `1+2` (which gets evaluated in arithmetic to 3), `1+2 < 5` (which gets evaluated in arithmetic to 'true), and `1`
+(which gets evaluated in arithmetic to 1). Also Google search strings, which get evaluated by Google servers to a
+list of links.
+
+The dominant contrasting class of programming languages (the great majority of what's used
+in industry) are called "imperatival" languages, meaning they have more to do with following a sequence of commands (what we
+called in class "side-effects", though sometimes what they're *alongside* is not that interesting, and all the focus is instead
+on the effect). Programming languages like C and Python and JavaScript and so on are all of this sort.
+
+In fact, nothing that gets marketed as a "programming language" is really completely 100% functional/declarative, and even the
+imperatival languages will have purely functional fragments (they evaluate `1+2` to 3, also). So these labels are really
+more about *styles* or *idioms* of programming, and languages like Scheme and OCaml and especially Haskell get called "functional languages" because
+of the extent to which they emphasize, and are designed around those idioms. Even languages like Python and JavaScript are sometimes
+described as "more functional" than some other languages. The language C is about as non-functional as you can get.
* **Scheme** is one of two major dialects of *Lisp*, which is a large family
of programming languages. Scheme
academic circles.
Scheme itself has umpteen different "implementations", which share most of
their fundamentals, but have slightly different extensions and interact with
-the operating system differently. One major implementation used to be called
-PLT Scheme, and has just in the past few weeks changed their name to Racket.
-This is what we recommend you use. (If you're already using or comfortable with
-another Scheme implementation, though, there's no compelling reason to switch.)
+the operating system differently. One major implementation is called Racket,
+and that is what we recommend you use. If you're already using or comfortable with
+another Scheme implementation, though, there's no compelling reason to switch.
Racket stands to Scheme in something like the relation Firefox stands to HTML.
+ (Wikipedia on [Lisp](http://en.wikipedia.org/wiki/Lisp_%28programming_language%29),
+[Scheme](http://en.wikipedia.org/wiki/Scheme_%28programming_language%29),
+and [Racket](http://en.wikipedia.org/wiki/Racket_%28programming_language%29).)
+
* **Caml** is one of two major dialects of *ML*, which is another large
-family of programming languages. Caml has only one active implementation,
-OCaml, developed by the INRIA academic group in France.
+family of programming languages. Caml has only one active "implementation",
+OCaml, developed by the INRIA academic group in France. Sometimes we may refer to Caml or ML
+more generally; but you can assume that what we're talking about always works more
+specifically in OCaml.
+
+ (Wikipedia on [ML](http://en.wikipedia.org/wiki/ML_%28programming_language%29),
+[Caml](http://en.wikipedia.org/wiki/Caml),
+and [OCaml](http://en.wikipedia.org/wiki/OCaml).)
+
* Those of you with some programming background may have encountered a third
prominent functional programming language, **Haskell**. This is also used a
familiar with one of them, it's not difficult to move between it and the
other.
-<!--
+ (Wikipedia on [Haskell](http://en.wikipedia.org/wiki/Haskell_%28programming_language%29).)
+
+
<a name=installing></a>
[[How to get the programming languages running on your computer]]
+<!--
[[Family tree of functional programming languages]]
[[Translating between OCaml Scheme and Haskell]]