(define length
(lambda (l)
(cond
((null? l) 0)
(else (add1 (length (cdr l)))))))
We won’t be able to refer to length.
λ to calculate length of list equal to 0
(lambda (l)
(cond
((null? l) 0)
(else (add1 (eternity (cdr l))))))
(lambda (l)
(cond
((null? l) 0)
(else (add1 (lambda (l)
(cond
((null? l) 0)
(else (add1 (eternity (cdr l))))))
(cdr l)))))
(lambda (l)
(cond
((null? l) 0)
(else (add1 (lambda (l)
(cond
((null? l) 0)
(else (add1 (lambda (l)
(cond
((null? l) 0)
(else (add1 (eternity (cdr l))))))
(cdr l)))))
(cdr l)))))
Recursion: Replacing function name with it’s body
Nineth Commandment
Abstract common patterns with a new function
((lambda (f)
(lambda (l)
(cond
((null? l) 0)
(else (add1 (f (cdr l)))))))
eternity)
((lambda (f)
(lambda (l)
(cond
((null? l) 0)
(else (add1 (f (cdr l)))))))
(lambda (l)
(cond
((null? l) 0)
(else (add1 (eternity (cdr l)))))))
((lambda (f)
(lambda (l)
(cond
((null? l) 0)
(else (add1 (f (cdr l)))))))
((lambda (g)
(lambda (l)
(cond
((null? l) 0)
(else (add1 (g (cdr l)))))))
(lambda (l)
(cond
((null? l) 0)
(else (add1 (eternity (cdr l))))))))
Too much repetition- try to get rid of them.
((lambda (mk-length)
(mk-length eternity))
(lambda (length)
(lambda (l)
(cond
((null? l) 0)
(else (add1 (length (cdr l))))))))
((lambda (mk-length)
(mk-length
(mk-length
(mk-length eternity))))
(lambda (length)
(lambda (l)
(cond
((null? l) 0)
(else (add1 (length (cdr l))))))))
Make a new length when required.
((lambda (mk-length)
(mk-length mk-length))
(lambda (mk-length)
(lambda (l)
(cond
((null? l) 0)
(else (add1 ((mk-length mk-length)
(cdr l))))))))
Let’s abstract out the mk-length to make the function look like length.
((lambda (mk-length)
(mk-length mk-length))
(lambda (mk-length)
(lambda (length)
(lambda (l)
(cond
((null? l) 0)
(else (add1 (length (cdr l)))))))
(mk-length mk-length)))
mk-length
no longer returns a function, instead it calls itself. Goes in ∞ recursion.
((mk-length mk-length) x) ;; will be infinite loop
(lambda (x)
((mk-length mk-length) x)) ;;will defer execution of mk-length
((lambda (mk-length)
(mk-length mk-length))
(lambda (mk-length)
(lambda (length)
(lambda (l)
(cond
((null? l) 0)
(else (add1 (length (cdr l)))))))
(lambda (x)
((mk-length mk-length) x))))
length
doesn’t depend on mk-length
. It can be taken out.
((lambda (f)
((lambda (mk-length)
(mk-length mk-length))
(lambda (mk-length)
(f
(lambda (x)
((mk-length mk-length) x))))))
(lambda (length)
(lambda (l)
(cond
((null? l) 0)
(else (add1 (length (cdr l))))))))
Let’s seperate the function that makes length
from function which looks like length
(lambda (le)
((lambda (f)
(f f))
(lambda (f)
(le (lambda (x)
((f f) x))))))
(define Y
(lambda (le)
((lambda (f)
(f f))
(lambda (f)
(le (lambda (x)
((f f) x)))))))