; Notes ; ----- ; 1. In this lecture, we have used "define" to define commonly used ; functions. However, we can write the whole program with all the functions ; defined by such constructs: ( (lambda (succ) ( ;;; Do something with succ - for example: (succ (lambda (f) (lambda (x) (f (f (f x)))))) ) ) ; This is the definition of succ that is accepted as a value to the ; function call. (lambda (n) (lambda (f) (lambda (x) (f ((n f) x)) ) ) ) ) ; 2. Representing arrays: arrays (a.k.a vectors) can be constructed using ; a binary tree complex of pairs whose leaves are the array's values. ; 3. Church Numerals are base-1 numbers so they are not very efficient. If ; you strive for calculation efficiency in lambda calculus you may wish ; to represent numbers as vectors of digits, and define calculations on them ; using Al-Khwarizmi's algorithms. ; 4. In order to do things like write to the screen, to files, or etc. You ; need to supply the lambda calculus program with stubs. That way, everything ; can be done in LC. ; 5. It was proved that every recursive function can be implemented in ; Lambda Calculus. ; 6. Lambda Calculus is fairly easy to write in languages that support lexical ; scoping and closures. For example: Scheme, Perl, Python and ML ; can all do LC without any special programming. ; In other languages, like C, Pascal, Assembly or Basic, one can implement ; Lambda Calculus using a stack. I don't remember the exact details, but it's ; possible. ; 7. One can define Y-like combinators that take functions of more than ; one argument (I mean (lambda (x) (lambda (y) ... ))). For example, the ; two-argument Y is: (define Y2 (lambda (g) ( (lambda (f) (g (lambda (x) (lambda (y) (((f f) x) y)))) ) (lambda (f) (g (lambda (x) (lambda (y) (((f f) x) y)))) ) ) ) ) ; 8. Instead of using pairs one can use a three-object tuple, or a four object ; tuple, etc. For example, the definition of the three-item tuple functions ; are: (define lc-cons-tuple3 (lambda (first) (lambda (second) (lambda (third) (lambda (which) (((which first) second) third) ) ) ) ) ) (define tuple3-get-first (lambda (tuple) (tuple (lambda (x) (lambda (y) (lambda (z) x)))) ) ) (define tuple3-get-second (lambda (tuple) (tuple (lambda (x) (lambda (y) (lambda (z) y)))) ) ) (define tuple3-get-third (lambda (tuple) (tuple (lambda (x) (lambda (y) (lambda (z) z)))) ) ) ; 9. It is sometimes useful to make a lambda expression into a tuple in which ; its car is a Church numeral that denotes its type, and specifies whether ; the cdr is a tuple, a church numeral, a function, a vector, etc. ; 10. Lambda Calculus still has a certain degree of arbitrarity. For example: ; Church numerals could have been defined as: (define zero (lambda (x) (lambda (f) x))) (define one (lambda (x) (lambda (f) (f x)))) (define two (lambda (x) (lambda (f) (f (f x))))) ; Etc. ; Or true could have been defined as false and false as true...