X-Git-Url: https://git.rkrishnan.org/?p=sicp.git;a=blobdiff_plain;f=src%2Fsicp%2Fex4_51.rkt;fp=src%2Fsicp%2Fex4_51.rkt;h=ccb5caa25fa031a2b82443cf1276b93fba6e52da;hp=0000000000000000000000000000000000000000;hb=5158bd64ca487b858c9d95e8a2bccb81fe2113a7;hpb=273f2bd230187a3164803ac32d9b5734d0123ad0 diff --git a/src/sicp/ex4_51.rkt b/src/sicp/ex4_51.rkt new file mode 100644 index 0000000..ccb5caa --- /dev/null +++ b/src/sicp/ex4_51.rkt @@ -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))))