The world was so recent that many things lacked names, and in order to indicate them it was necessary to point.
Gabriel Garciá Márquez on Anonymous Functions
A dialogue between two seekers of knowledge
Alexis: Tael'r, I beseech your aid.
Tael'r: What is it, friend?
Alexis: I am uncovering the mysteries of higher-order procedures, but I am battling a bug.
Tael'r: Pray, show me your code.
Alexis: Very well. I am trying to implement Simpson's Rule as specified in Exercise 1.29.
(define (sum term a next b) (if (> a b) 0 (+ (term a) (sum term (next a) next b)))) (define (cube x) (* x x x)) (define (inc x) (+ x 1)) (define (simpson n f a b) ((let ((h (/ (- b a) n))) (define (simpson-term k) (let ((y (f (+ a (* k h))))) (if (or (= k 0) (= k n)) y (if (even? k) (* 2 y) (* 4 y))))) (* (/ h 3) (sum simpson-term a inc b)))))
Tael'r: Do you know where the bug hides?
Alexis: No. The interpreter tells me that
The object 1/75000000 is not applicable.. But I lack the skill with the debugger to tell where this is happening.
Tael'r: Well then, I recommend you simplify. We don't need to abandon all we have learned because we are working with a new language. When you don't understand a problem, break it down.
Alexis: Of course. Thank you, my wise friend.
Alexis returns to the mountain where she does her coding and returns some minutes later.
Alexis: I got it to work! But it's a bit... janky.
Tael'r: Let me see.
(define (simpson-term a h k n f) ; Compute y sub k (let ((y (f (+ a (* k h))))) ;Special cases for first and final term (cond ((or (= k 0) (= k n)) y) ((even? k) (* 2 y)) ((odd? k) (* 4 y))))) (define (curry-simpson a h n f) (lambda (k) (simpson-term a h k n f))) (define (simpson f a b n) (let ((h (/ (- b a) n))) (* (/ h 3) (sum (curry-simpson a h n f) a inc n))))
Tael'r: Ah, I see. To break the problem apart you had to find a way to bind variables local to
Alexis: Yes, I think this is more complex than it needs to be.
Tael'r: Perhaps. And I think you're abusing the term "curry", but I get what you mean. That's ok. One must write ugly code before writing elegant code.
Alexis: The road to enlightenment will be long.