(define (square x)
(* x x))
===
(define square
(lambda (x)
(* x x)))
(define (square-sum a b)
(+ (square a) (square b)))
(define (fact n)
(if (= n 1)
1
(* n (fact (1- n)))))
(define account 1000)
(define (withdraw1 sum)
(if (> sum account)
(error "Insufficient funds!" account)
(set! account (- account sum))))
(define withdraw2
(let ((account 1000))
(lambda (sum)
(if (> sum account)
(error "Insufficient funds!" account)
(set! account (- account sum))))))
===
(define withdraw2
((lambda (account)
(lambda (sum)
(if (> sum account)
(error "Insufficient funds!" account)
(set! account (- account sum)))))
1000))
(define (create-account1 account)
(lambda (sum)
(if (> sum account)
(error "Insufficient funds!" account)
(set! account (- account sum)))))
(define (create-account2 init)
(let ((account init))
(lambda (sum)
(if (> sum account)
(error "Insufficient funds!" account)
(set! account (- account sum))))))
(define (create-account3 init)
(let ((account init))
(define (deposit sum)
(set! account (+ account sum)))
(define (withdraw sum)
(set! account (- account sum)))
(define (dispatch m)
(cond ((eq? m 'deposit) deposit)
((eq? m 'withdraw) withdraw)
(else (error "Wrong message!" m))))
dispatch))