]> git.rkrishnan.org Git - sicp.git/blobdiff - src/sicp/ex4_51.rkt
Merge branch 'master' of github.com:vu3rdd/sicp
[sicp.git] / src / sicp / ex4_51.rkt
diff --git a/src/sicp/ex4_51.rkt b/src/sicp/ex4_51.rkt
new file mode 100644 (file)
index 0000000..ccb5caa
--- /dev/null
@@ -0,0 +1,28 @@
+#lang racket
+
+;;; assignment
+(define (analyze-assignment expr)
+  (let ([var (assignment-var expr)]
+        [vproc (analyze (assignment-value expr))])
+    (lambda (env succeed fail)
+      (vproc env
+             (lambda (val fail2)
+               (let ([old-val (lookup-variable-value var env)])
+                 (set-variable-value! var val)
+                 (succeed 'ok
+                          (lambda ()
+                            (set-variable-value! var old-val env)
+                            (fail2)))))
+             fail))))
+
+;; permenent-set!
+;;; assignment
+(define (analyze-permanent-assignment expr)
+  (let ([var (perm-assignment-var expr)]
+        [vproc (analyze (perm-assignment-value expr))])
+    (lambda (env succeed fail)
+      (vproc env
+             (lambda (val fail2)
+               (set-variable-value! var val)
+               (succeed 'ok fail2))
+             fail))))