A *(Learning Lounge) course about _(Programming Language)s.

First, we'd like to explain <em>why</em> we feel the need to introduce some ideas here from around the spectrum, and to explain our choices: the best way to put this is expressed in an old essay: _(Teaching the Fatal Disease| http://plg.uwaterloo.ca/~holt/papers/fatal_disease.html) <em>(or) Introductory Computer Programming Using _(PL/I)</em>, written in 1972 by Richard C. Holt, but re-published in 1999, probably due to the inordinate number of programmers introduced to programming lately via _(C++) and _(Java).

<em>Starting Forth</em> by Leo Brodie is <strong>a great first approach to programming</strong>. Lets you learn basic concepts to understand how a computer works, with a paradigm good for low-level and high-level programming alike.

_("Concepts, Techniques and Models of Computer Programming"|http://www.info.ucl.ac.be/~pvr/book.html) by Peter Van Roy and Seif Haridi. The authors give this summary (excerpt):
<blockquote>
[..] The book is organized around <strong>programming concepts</strong>. It starts with a small language containing just a few concepts. It shows how to design, write programs, and reason in this language. It then adds concepts one by one to the language to overcome limitations in expressiveness. In this way, it situates most well-known programming paradigms in a uniform framework. More than twenty paradigms are given, all represented as subsets of the multi_(paradigm) language _(Oz|Mozart/Oz). [..]
</blockquote>
<strong>Note</strong>: this is a big book, the April 26, 2003 Draft is 976 pages.

The _(TeachScheme!|http://www.teach-scheme.org/) project has many good books.

_(The Structure and Interpretation of Computer Programs|SICP) is a very insightful intro to many programming paradigms. It requires the reader to be quite good at abstract thinking, and a background in math or physics helps a lot.

_(The Essentials of Programming Languages| http://www.cs.indiana.edu/eopl/), another good book on the subject, again utilizing _(Scheme). See also the _(first edition home page| http://www.cs.indiana.edu/eip/eopl.html), which explains some of the contents.

<u>Programming Language Concepts and Paradigms</u> (is this online anywhere?) is another good intro to the subject, utilizing _(ML).

Here are just some examples of what to study and gain some experience in after that:

<ul>
<li>_("On Lisp"|http://www.paulgraham.com/onlisptext.html) by Paul Graham, on the power of _(macro)s.
  <br>A D. B. Lamkins wrote _("Successful Lisp"|http://psg.com/~dlamkins) that will help if lack of familiarity with _(Common Lisp) is a problem.
<li>_(Self), as an example of prototype-based _(oo) but also as a first contact with self-contained reflective dynamically compiled systems. Alternatives: _(Squeak), _(Lisp machine)s.
<li>Something on _(Meta-Object Protocol)s and _(aspect-oriented programming).
<li>_(OCaml) or _(Haskell) for _(functional) programming, rather than _(Standard ML|ML).  <i>What's wrong with SML?</i>
<li>_(Mercury) or _(Mozart/Oz) for modern _(declarative) programming, rather than _(Prolog).
<li>_(JoCaml) or _(Mozart/Oz) or _(O'Haskell) for parallellism and distribution.
<li>For the essence of obfuscation: _(unlambda) (plain combinators), _(brainfuck) (minimal virtual machine), _(intercal) (fascist arbitrary limitations), etc. Knowing how things can be wrong can help you understand better how they should be right.
</ul>

Prof Leavens' page about _(teaching programming languages| http://www.cs.iastate.edu/~leavens/teaching-prog-lang/home.html).