From: Ramakrishnan Muthukrishnan Date: Fri, 26 Jul 2013 08:26:49 +0000 (+0530) Subject: Merge branch 'master' of github.com:vu3rdd/sicp X-Git-Url: https://git.rkrishnan.org/?p=sicp.git;a=commitdiff_plain;h=5158bd64ca487b858c9d95e8a2bccb81fe2113a7;hp=273f2bd230187a3164803ac32d9b5734d0123ad0 Merge branch 'master' of github.com:vu3rdd/sicp --- diff --git a/src/sicp/ex4_50.rkt b/src/sicp/ex4_50.rkt new file mode 100644 index 0000000..69f61b8 --- /dev/null +++ b/src/sicp/ex4_50.rkt @@ -0,0 +1,13 @@ +#lang racket + +#| + +In this original definition of amb-choices, + +(define (amb-choices expr) (rest expr)) + +instead return the shuffled values + +(define (amb-choices expr) (shuffle (rest expr))) + +|# \ No newline at end of file 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)))) diff --git a/src/sicp/ex4_52.rkt b/src/sicp/ex4_52.rkt new file mode 100644 index 0000000..3c60f2c --- /dev/null +++ b/src/sicp/ex4_52.rkt @@ -0,0 +1,12 @@ +#lang racket + +;; if-fail + +(define (analyze-if-fail expr) + (let ([sproc (analyze (if-fail-success expr))] + [fproc (analyze (if-fail-failure expr))]) + (lambda (env succeed fail) + (sproc env + succeed + (lambda () + (fexpr env succeed fail)))))) \ No newline at end of file diff --git a/src/sicp/ex4_54.rkt b/src/sicp/ex4_54.rkt new file mode 100644 index 0000000..79dcb0c --- /dev/null +++ b/src/sicp/ex4_54.rkt @@ -0,0 +1,15 @@ +#lang racket + +(define (assert? expr) (tagged-list? expr 'assert)) + +(define (assert-predicate expr) (first (rest expr))) + +(define (analyze-assert exp) + (let ((pproc (analyze (assert-predicate exp)))) + (lambda (env succeed fail) + (pproc env + (lambda (pred-value fail2) + (if (not (true? pred-value)) + (fail) + (succeed 'ok fail2))) + fail)))) \ No newline at end of file