From 7f868dc74d7360b25e6d58856896e227def9b2c8 Mon Sep 17 00:00:00 2001 From: Jim Pryor Date: Wed, 15 Sep 2010 23:10:38 -0400 Subject: [PATCH] week1: fix markup processing? Signed-off-by: Jim Pryor --- test2.mdwn | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/test2.mdwn b/test2.mdwn index afe1b696..dcc8a1a7 100644 --- a/test2.mdwn +++ b/test2.mdwn @@ -601,3 +601,80 @@ Here's how it looks to say the same thing in various of these languages. It's easy to be lulled into thinking this is a kind of imperative construction. *But it's not!* It's really just a shorthand for the compound "let"-expressions we've already been looking at, taking the maximum syntactically permissible scope. (Compare the "dot" convention in the lambda calculus, discussed above.) + +9. Some shorthand + + OCaml permits you to abbreviate: + + let bar = fun x -> B in + M + + as: + + let bar x = B in + M + + It also permits you to abbreviate: + + let bar = fun x -> B;; + + as: + + let bar x = B;; + + Similarly, Scheme permits you to abbreviate: + + (define bar (lambda (x) B)) + + as: + + (define (bar x) B) + + and this is the form you'll most often see Scheme definitions written in. + + However, conceptually you should think backwards through the abbreviations and equivalences we've just presented. + + (define (bar x) B) + + just means: + + (define bar (lambda (x) B)) + + which just means: + + (let* [(bar (lambda (x) B))] ... rest of the file or interactive session ...) + + which just means: + + (lambda (bar) ... rest of the file or interactive session ...) (lambda (x) B) + + or in other words, interpret the rest of the file or interactive session with `bar` assigned the function `(lambda (x) B)`. + + +10. Shadowing + + You can override a binding with a more inner binding to the same variable. For instance the following expression in OCaml: + + let x = 3 in + let x = 2 in + x + + will evaluate to 2, not to 3. It's easy to be lulled into thinking this is the same as what happens when we say in C: + + int x = 3; + x = 2; + + but it's not the same! In the latter case we have mutation, in the former case we don't. You will learn to recognize the difference as we proceed. + + The OCaml expression just means: + + (fun x -> ((fun x -> x) 2) 3) + + and there's no more mutation going on there than there is in: + +
+	∀x. (F x or ∀x (not (F x)))
+	
+ + When a previously-bound variable is rebound in the way we see here, that's called **shadowing**: the outer binding is shadowed during the scope of the inner binding. + -- 2.11.0