|author||bnewbold <email@example.com>||2009-01-14 16:24:34 -0500|
|committer||bnewbold <firstname.lastname@example.org>||2009-01-14 16:24:34 -0500|
bunch of new
Diffstat (limited to 'books')
1 files changed, 105 insertions, 0 deletions
diff --git a/books/Little Schemer b/books/Little Schemer
new file mode 100644
+++ b/books/Little Schemer
@@ -0,0 +1,105 @@
+The Little Schemer
+:by: Daniel Friedman and Matthias Felleisen
+:Edition: Fourth (4rth)
+See also `Scheme </k/software/scheme/>`__.
+I read this book before starting on a scheme/physics project. I had programmed
+in scheme previously as an algebra/analysis tool, but never really sat down
+and got comfortable with the language. Working through all the examples
+has made me *much* more comfortable with this style of programming. Despite
+the humble tone and ambitions of the book I think I learned deeply.
+The first 7 chapters were very straight forward, the end of chapter 8 took
+some more thought and I'm not sure how happy I am with the description of
+collectors and continuations.
+This book is followed by `The Seasoned Schemer </k/books/seasonedschemer/>`__
+and The Reasoned Schemer.
+This primitive function is required for most of the functions in the book::
+ (define atom?
+ (lambda (x)
+ (and (not (pair? x)) (not (null? x)))))
+Law of Car
+ The primitive *car* is defined only for non-empty lists.
+Law of Cdr
+ The primitive *cdr* is defined only for non-empty lists. The *cdr* of any
+ non-empty list is always another list.
+Law of Cons
+ The primitive *cons* takes two arguments. The second argument to *cons*
+ must be a list. The result is a list.
+Law of Null?
+ The primitive *null?* is defined only for lists.
+Law of Eq?
+ The primitive *eq?* takes two arguments. Each must be a non-numeric atom.
+The First Commandment
+ When recurring on a list of atoms, *lat*, ask two questions about it:
+ *(null? lat)* and **else**. When recurring on a number, *n*, ask two
+ questions about it: *(zero? n)* and **else**.
+ When recurring on a list of S-expressions, *l*, ask three questions
+ about it: *(null? l)*, *(atom? (car l))*, and **else**.
+The Second Commandment
+ Use *cons* to build lists.
+The Third Commandment
+ When building a list, describe the first typical element, and then
+ *cons* it onto the natural recursion.
+The Fourth Commandment
+ Always change at least one argument while recurring. It must be changed to
+ be closer to termination. The changing argument must be tested in the
+ termination condition:
+ when using *cdr*, test termination with *null?* and
+ when using *sub1*, test termination with *zero?*.
+The Fifth Commandment
+ When building a value with +, always use 0 for the value of the terminating
+ line, for adding 0 does not change the value of an addition.
+ When building a value with x, always use 1 for the value of the terminating
+ line, for multiplying by 1 does not change the value of a multiplication.
+ When building a value with cons, always consider () for the value of the
+ terminating line.
+The Sixth Commandment
+ Simplify only after the function is correct.
+The Seventh Commandment
+ Recur on the subpart that are of the same nature:
+ * on the sublists of a list.
+ * on the subexpressions of an arithmetic expression.
+The Eighth Commandment
+ Use help functions to abstract from representations.
+The Ninth Commandment
+ Abstract common patterns with a new function.
+The Tenth Commandment
+ Build functions to collect more than one value at a time.