diff options
Diffstat (limited to 'books/Little Schemer')
-rw-r--r-- | books/Little Schemer | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/books/Little Schemer b/books/Little Schemer new file mode 100644 index 0000000..394de5b --- /dev/null +++ b/books/Little Schemer @@ -0,0 +1,108 @@ +============================ +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. + +For a better description of the Y-combinator, see these `course notes +<http://dangermouse.brynmawr.edu/cs245/ycomb_jim.html>`__. + +This book is followed by `The Seasoned Schemer </k/books/seasonedschemer/>`__ +and The Reasoned Schemer. + +Preface Definitions +------------------------ +This primitive function is required for most of the functions in the book:: + + (define atom? + (lambda (x) + (and (not (pair? x)) (not (null? x))))) + +Laws +----------------------- +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. + +Commandments +------------------------ + +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. + |