general form of let expression
syntax
- (let <bindings> <expr>)
- <bindings> has form ((<var> <expr>) (<var> <expr>) …)
evaluation rule
- to evaluate (let ((v1 e1) (v2 e2) … ) e),evaluate ei –> Ei and bind vi to Ei, then evaluate e –> Evalue of entire expression is E
- equivalent to ((lambda (v1 v2 …) e) e1 e2 …))
puzzle 1
- is (let ((x 3) (y x)) y) legal? how about (let ((x 3)) (let ((y x)) y))?
- translate to lambda to see
puzzle 2
- can let replace define for binding recursive helper procedures?
- for example, will this work?
(define (exp x k)(let ((expi (lambda (i s) (if (= i 0) s (expi (dec i) (* s x)))))) (expi k 1)))
- no, it won’t: need “letrec”