From a09d9be5915e8745aebbeb3973e97a9db706db73 Mon Sep 17 00:00:00 2001
From: Ramakrishnan Muthukrishnan <vu3rdd@gmail.com>
Date: Sun, 2 Jan 2011 22:35:35 +0530
Subject: [PATCH] solutions to ex 3.1, 3.2, 3.3 and 3.4

---
 src/sicp/ex3_1.rkt |  7 +++++++
 src/sicp/ex3_2.rkt | 29 ++++++++++++++++++++++++++++
 src/sicp/ex3_3.rkt | 19 ++++++++++++++++++
 src/sicp/ex3_4.rkt | 48 ++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 103 insertions(+)
 create mode 100644 src/sicp/ex3_1.rkt
 create mode 100644 src/sicp/ex3_2.rkt
 create mode 100644 src/sicp/ex3_3.rkt
 create mode 100644 src/sicp/ex3_4.rkt

diff --git a/src/sicp/ex3_1.rkt b/src/sicp/ex3_1.rkt
new file mode 100644
index 0000000..4bd1ef9
--- /dev/null
+++ b/src/sicp/ex3_1.rkt
@@ -0,0 +1,7 @@
+#lang racket
+
+(define (make-accumulator acc)
+  (lambda (val)
+    (begin
+      (set! acc (+ acc val))
+      acc)))
\ No newline at end of file
diff --git a/src/sicp/ex3_2.rkt b/src/sicp/ex3_2.rkt
new file mode 100644
index 0000000..de275ef
--- /dev/null
+++ b/src/sicp/ex3_2.rkt
@@ -0,0 +1,29 @@
+#lang racket
+
+(define (make-monitored f)
+  (let ((num-calls 0))
+    (lambda (x)
+      (cond 
+        ((eq? x 'how-many-calls?) num-calls)
+        (else 
+         (begin
+           (set! num-calls (+ num-calls 1))
+           (f x)))))))
+
+#|
+> (define (square x) (* x x))
+> (square 4)
+16
+> (define mf (make-monitored square))
+> (mf 'how-many-calls?)
+0
+> (mf 10)
+100
+> (mf 'how-many-calls?)
+1
+> (mf 100)
+10000
+> (mf 'how-many-calls?)
+2
+> 
+|#
\ No newline at end of file
diff --git a/src/sicp/ex3_3.rkt b/src/sicp/ex3_3.rkt
new file mode 100644
index 0000000..0f6b79e
--- /dev/null
+++ b/src/sicp/ex3_3.rkt
@@ -0,0 +1,19 @@
+#lang racket
+
+(define (make-account balance password)
+  (define (withdraw amount)
+    (if (>= balance amount)
+        (begin (set! balance (- balance amount))
+               balance)
+        "Insufficient funds"))
+  (define (deposit amount)
+    (set! balance (+ balance amount))
+    balance)
+  (define (dispatch given-password m)
+    (if (eq? given-password password)
+        (cond ((eq? m 'withdraw) (lambda (amt) (withdraw amt)))
+              ((eq? m 'deposit) (lambda (amt) (deposit amt)))
+              (else (error "Unknown request -- MAKE-ACCOUNT"
+                           m)))
+        (lambda (temp) "Incorrect password")))
+  dispatch)
\ No newline at end of file
diff --git a/src/sicp/ex3_4.rkt b/src/sicp/ex3_4.rkt
new file mode 100644
index 0000000..ac8e334
--- /dev/null
+++ b/src/sicp/ex3_4.rkt
@@ -0,0 +1,48 @@
+#lang racket
+
+(define (make-account balance password)
+  (define (withdraw amount)
+    (if (>= balance amount)
+        (begin (set! balance (- balance amount))
+               balance)
+        "Insufficient funds"))
+  (define (deposit amount)
+    (set! balance (+ balance amount))
+    balance)
+  (let ((bad-password-count 0))
+    (define (dispatch given-password m)
+      (if (eq? given-password password)
+          (cond ((eq? m 'withdraw) (lambda (amt) (withdraw amt)))
+                ((eq? m 'deposit) (lambda (amt) (deposit amt)))
+                (else (error "Unknown request -- MAKE-ACCOUNT"
+                             m)))
+          (lambda (temp) 
+            (begin
+              (set! bad-password-count (+ bad-password-count 1))
+              (if (>= bad-password-count 7)
+                  "Something is wrong. Calling 911..."
+                  "Incorrect password")))))
+    dispatch))
+
+#|
+
+> (define acc (make-account 100 'secret-password))
+> ((acc 'secret-password 'withdraw) 40)
+60
+> ((acc 'some-other-password 'deposit) 50)
+"Incorrect password"
+> ((acc 'some-other-password 'deposit) 50)
+"Incorrect password"
+> ((acc 'some-other-password 'deposit) 50)
+"Incorrect password"
+> ((acc 'some-other-password 'deposit) 50)
+"Incorrect password"
+> ((acc 'some-other-password 'deposit) 50)
+"Incorrect password"
+> ((acc 'some-other-password 'deposit) 50)
+"Incorrect password"
+> ((acc 'some-other-password 'deposit) 50)
+"Something is wrong. Calling 911..."
+> 
+
+|#
\ No newline at end of file
-- 
2.45.2