]> git.rkrishnan.org Git - sicp.git/commitdiff
bug fixes
authorRamakrishnan Muthukrishnan <vu3rdd@gmail.com>
Sat, 19 Nov 2011 05:05:38 +0000 (10:35 +0530)
committerRamakrishnan Muthukrishnan <vu3rdd@gmail.com>
Sat, 19 Nov 2011 05:05:38 +0000 (10:35 +0530)
src/sicp/ex4_11.rkt
src/sicp/ex4_7.rkt
src/sicp/ex4_8.rkt

index 00f79a2f243e8e1f0b1aa61e7399800755f6720f..0b60119dcc31a9070fc239064a5614367ac671ac 100644 (file)
@@ -1,4 +1,8 @@
-#lang racket
+#lang r5rs
+
+(define (error x)
+  (display x)
+  (newline))
 
 (define (make-frame variables values)
   (if (not (= (length variables)
   (map cdr frame))
 
 (define (add-binding-to-frame! var val frame)
-  (set! frame (cons (cons var val) frame)))
+  (define (add-to-end-of-frame! b f)
+    (if (null? (cdr f))
+        (set-cdr! f b)
+        (add-to-end-of-frame! b (cdr f))))
+  (add-to-end-of-frame! (cons var val) frame))
+
+(define (lookup-variable-value var env)
+  (define (env-loop env)
+    (define (scan frame)
+      (if (null? frame)
+          (env-loop (enclosing-environment env))
+          (let ((p (car frame)))
+            (if (eq? var (car p))
+                (cdr p)
+                (scan (cdr frame))))))
+    (if (eq? env the-empty-environment)
+        (error "variable not defined")
+        (let ((f (first-frame env)))
+          (scan f))))
+  (env-loop env))
+
+(define (set-variable-value! var val env)
+  (define (env-loop env)
+    (define (scan frame)
+      (if (null? frame)
+          (env-loop (enclosing-environment env))
+          (let ((p (car frame)))
+            (if (eq? var (car p))
+                (set-cdr! p val)
+                (scan (cdr frame))))))
+    (if (eq? env the-empty-environment)
+        (error "variable not defined")
+        (let ((f (first-frame env)))
+          (scan f))))
+  (env-loop env))
+
+(define (define-variable! var val env)
+  (let ((frame (first-frame env)))
+    (define (scan frame)
+      (if (null? frame)
+          (add-binding-to-frame var val frame)
+          (let ((p (car frame)))
+            (if (eq? (car p) var)
+                (set-cdr! p val)
+                (scan (cdr frame))))))
+    (scan frame)))
index 956095d023d1988b1e6e52a03377b69a483f9595..8bb4aa08e7b1140f8ea140fa147d4524c8b041d1 100644 (file)
@@ -1,5 +1,7 @@
 #lang racket
 
+(provide let*? let*->nested-lets)
+
 (define (tagged-list? exp tag)
   (if (pair? exp)
       (eq? (car exp) tag)
index d58eb4dd28aa8b325f8218b5d8360fcdd9967f6e..1647aea266d386159dcc35094098a5b94f6b7877 100644 (file)
@@ -1,6 +1,6 @@
 #lang racket
 
-(provide let->combination)
+(provide let->combination let?)
 
 (define (tagged-list? exp tag)
   (if (pair? exp)