(define (make-withdraw initial-amount) (let ((balance initial-amount)) (lambda (amount) (if (>= balance amount) (begin (set! balance (- balance amount)) balance) "Insufficient funds")))) ; Is equivalent to (define (make-withdraw initial-amount) ((lambda (balance) (lambda (amount) (if (>= balance amount) (begin (set! balance (- balance amount)) balance) "Insufficient funds"))) initial-amount)) ; After (define W1 (make-withdraw 100)) global env ------------------ | |<--- env: global env | | parameters: initial-amount | make-withdraw: ----> body: | | ((lambda (balance) | | (lambda (amount) | | (if (>= balance amount) | | (begin (set! balance (- balance amount)) | | balance) | | "Insufficient funds"))) initial-amount) | | | | E1 | | ----------------------- | |<----| initial-amount: 100 | | | ----------------------- | | /\ | | E2 | | | ---------------- | | | balance: 100 | | | ---------------- | | /\ | | | | | env: E2 | | parameters: amount | W1: ---------------> body: | | (if (>= balance amount) | | (begin (set! balance (- balance amount)) | | balance) | | "Insufficient funds") ------------------ ; After (W1 50) global env ------------------ | |<--- env: global env | | parameters: initial-amount | make-withdraw: ----> body: | | ((lambda (balance) | | (lambda (amount) | | (if (>= balance amount) | | (begin (set! balance (- balance amount)) | | balance) | | "Insufficient funds"))) initial-amount) | | | | E1 | | ----------------------- | |<----| initial-amount: 100 | | | ----------------------- | | /\ | | E2 | | | --------------- | | | balance: 50 | | | --------------- | | /\ | | | | | env: E2 | | parameters: amount | W1: ---------------> body: | | (if (>= balance amount) | | (begin (set! balance (- balance amount)) | | balance) | | "Insufficient funds") ------------------ ; After (define W2 (make-withdraw 100)) global env ------------------ | |<--- env: global env | | parameters: initial-amount | make-withdraw: ----> body: | | ((lambda (balance) | | (lambda (amount) | | (if (>= balance amount) | | (begin (set! balance (- balance amount)) | | balance) | | "Insufficient funds"))) initial-amount) | | | | E1 | | ----------------------- | |<----| initial-amount: 100 | | | ----------------------- | | /\ | | E2 | | | --------------- | | | balance: 50 | | | --------------- | | /\ | | | | | env: E2 | | parameters: amount | W1: ---------------> body: | | (if (>= balance amount) | | (begin (set! balance (- balance amount)) | | balance) | | "Insufficient funds") | | E3 | | ----------------------- | |<----| initial-amount: 100 | | | ----------------------- | | /\ | | E4 | | | ---------------- | | | balance: 100 | | | ---------------- | | /\ | | | | | env: E2 | | parameters: amount | W2: ---------------> body: | | (if (>= balance amount) | | (begin (set! balance (- balance amount)) | | balance) | | "Insufficient funds") ------------------ The difference in environments, is the implementation using let/lambda create another environment storing the initial balance.