cd1d9cbecad960e2dcdb520105d456216b4c35b1
[lambda.git] / offsite_reading.mdwn
1 Many off these links are to Wikipedia. You can learn a lot from such articles,
2 so long as you remember they may sometimes mislead or make mistakes. However, I
3 hope at this point in your education you'll have learned to be a guarded reader
4 even of authoritative treatises by eminent authors. So you shouldn't need any
5 Wikipedia-specific warnings.
6
7 For most readers, many bits of reading we point you to will be hairy in one way
8 or another. It may be aimed at audiences with more programming experience; it
9 may be aimed at audiences with specific logical background you don't yet have;
10 it may be aimed at audiences familiar with technical areas in linguistics you're
11 first encountering. Or perhaps several of these at once. We hope you will
12 already have mastered the skill of leveraged reading: getting what you can out
13 of an article you don't fully understand, so that you can discuss it with the rest of
14 the group and hopefully get to a point where you can read it again and
15 get more out of out. (Rinse and repeat.)
16
17
18 ## General issues about variables and binding in programming languages ##
19
20 *       [[!wikipedia Variable (programming)]]
21 *       [[!wikipedia Variable shadowing]]
22 *       [[!wikipedia Scope (programming)]]
23 *       [[!wikipedia Free variables and bound variables]]
24 *       [[!wikipedia Name binding]]
25 *       [[!wikipedia Name resolution]]
26 *       [[!wikipedia Parameter (computer science)]]
27
28 ## Functions as values, etc ##
29
30 *       [[!wikipedia Higher-order function]]
31 *       [[!wikipedia First-class function]]
32 *       [[!wikipedia Closure (computer science)]]
33 *       [[!wikipedia Currying]]
34 *       [[!wikipedia Recursion (computer science)]]
35
36 ## Functional vs imperative programming ##
37
38 *       [[!wikipedia Declarative programming]]
39 *       [[!wikipedia Functional programming]]
40 *       [[!wikipedia Purely functional]]
41 *       [[!wikipedia Referential transparency (computer science)]]
42 *       [[!wikipedia Imperative programming]]
43
44 ## Untyped lambda calculus and combinatory logic ##
45
46 *       [[!wikipedia Lambda calculus]]
47 *       [Chris Barker's Lambda Tutorial](http://homepages.nyu.edu/~cb125/Lambda)<p>
48
49 *       [[!wikipedia Haskell Curry]]
50 *       [[!wikipedia Moses Schönfinkel]]
51 *       [[!wikipedia Alonzo Church]]<p>
52 *       [[!wikipedia Combinatory logic]]
53 *       [Combinatory logic](http://plato.stanford.edu/entries/logic-combinatory/) at the Stanford Encyclopedia of Philosophy
54 *       [[!wikipedia SKI combinatory calculus]]<p>
55 *       [[!wikipedia B,C,K,W system]]
56 *       [[!wikipedia Church-Rosser theorem]]
57 *       [[!wikipedia Normalization property]]
58 *       [[!wikipedia Turing completeness]]<p>
59 *       [[!wikipedia Church encoding]]
60 *       [[!wikipedia Y combinator]]<p>
61 *       [[!wikipedia Curry-Howard isomorphism]]<p>
62 *       [[!wikipedia Evaluation strategy]]
63 *       [[!wikipedia Eager evaluation]]
64 *       [[!wikipedia Lazy evaluation]]
65 *       [[!wikipedia Strict programming language]]
66
67 ## Learning Scheme ##
68
69 *       [Wikipedia overview of Scheme](http://en.wikipedia.org/wiki/Scheme_%28programming_language%29)
70
71 *       If you are new to programming or if you have the patience to work through a textbook, you should work through a textbook. Some good choices are The Little Schemer book(s) we recommended for the seminar; and also:
72
73         +       [How to Design Programs](http://www.htdp.org/2003-09-26/), by Matthias Felleisen, et al., which the Racket groups recommends. Whenever the book says "Scheme," you can read it as "Racket."
74
75         Another warmly-recommended introduction available online is:
76
77         +       [Teach Yourself Scheme in Fixnum Days](http://www.ccs.neu.edu/home/dorai/t-y-scheme/t-y-scheme.html)
78
79 *       If you're already a programmer and you're in more of a hurry, you could instead look at the [Quick Introduction to Racket](http://docs.racket-lang.org/quick/index.html). This tutorial provides a brief introduction to the Racket programming language by using DrRacket and one of Racket's picture-drawing libraries.
80
81 *       [An Introduction to Lambda Calculus and Scheme](http://www.jetcafe.org/~jim/lambda.html) is also aimed at programmers.
82
83 *       After any of the preceding, you could move on to [Racket Guide](http://docs.racket-lang.org/guide/index.html). This starts with a tutorial on Racket basics; then it describes the rest of the Racket language. This guide is intended for programmers who are new to Racket or new to some part of Racket. It assumes programming experience, so if you are new to programming, you should instead start with one of the textbooks listed above. This Guide describes parts of the Racket language which go beyond the learning-oriented fragments of How to Design Programs.
84
85 *       The [Complete Racket Reference Manual](http://docs.racket-lang.org/reference/index.html) defines the core Racket language and describes its most prominent libraries. The Racket Guide is friendlier; though less precise and less complete.
86
87 *       The Scheme language is standardized; the various implementations of the
88 language usually adhere to what's published in the current standard and add on
89 different handy extensions. The first standard was published in 1975. A
90 revision was published in 1978 called "The revised report on Scheme, a
91 dialect of Lisp." Thereafter, revisions of the standard were titled "The
92 Revised Revised Report..." and so on, or "The Revised^n Report..." for
93 short, for increasing n. The most widely implemented standard is [The
94 Revised^5 Report on Scheme](http://docs.racket-lang.org/r5rs/index.html),
95 or R5RS, published in 1998.
96 \[[Alt link](http://www.schemers.org/Documents/Standards/R5RS/HTML/)\]
97 A new standard [R6RS](http://docs.racket-lang.org/r6rs/index.html) was ratified
98 in 2007, but this has many detractors and has not been fully accepted in the
99 community.
100 \[[Alt link](http://www.r6rs.org/final/html/r6rs/r6rs.html);
101 [Libraries](http://www.r6rs.org/final/html/r6rs-lib/r6rs-lib.html)\]
102
103 *       [Scheme FAQ](http://community.schemewiki.org/?scheme-faq)
104
105 *       [Scheme Requests for Implementation](http://srfi.schemers.org/) (SRFI)
106
107 *       The [Schematics Scheme Cookbook](http://schemecookbook.org/) is a collaborative effort to produce documentation and recipes for using Scheme for common tasks.
108
109
110
111 ## Types ##
112
113 *       [[!wikipedia Tagged union]]
114 *       [[!wikipedia Algebraic data type]]
115 *       [[!wikipedia Pattern matching]]
116 *       [[!wikipedia Unit type]]
117 *       [[!wikipedia Bottom type]]
118 *       [[!wikipedia Typed lambda calculus]]
119 *       [[!wikipedia Simply typed lambda calculus]]
120 *       [Type Theory](http://plato.stanford.edu/entries/type-theory/) at the Stanford Encyclopedia of Philosophy
121 *       [Church's Type Theory](http://plato.stanford.edu/entries/type-theory-church/) at the Stanford Encyclopedia of Philosophy
122 *       [[!wikipedia Type polymorphism]]
123 *       [[!wikipedia System F]]
124
125 ## Learning OCaml ##
126
127 *       [[!wikipedia Objective Caml]]
128
129 ## Side-effects / mutation ##
130
131 *       [[!wikipedia Side effect (computer science)]]
132 *       [[!wikipedia Reference (computer science)]]
133 *       [[!wikipedia Pointer (computing)]]
134
135 ## Continuations ##
136
137 *       [[!wikipedia Continuation]]
138 *       [[!wikipedia Continuation-passing style]]
139 *       [[!wikipedia Call-with-current-continuation]]
140 *       [Intro to call/cc](http://community.schemewiki.org/?call-with-current-continuation) at SchemeWiki
141 *       [[!wikipedia Delimited continuation]]
142 *       [Delimited/composable continuations tutorial](composable-continuations-tutorial) at SchemeWiki
143
144 ## Monads ##
145
146 *       [[!wikipedia Monad (functional programming)]]
147
148 ## Linear Logic ##
149
150 *       [[!wikipedia Linear logic]]
151