sicp-ex-4.52



<< Previous exercise (4.51) | Index | Next exercise (4.53) >>


woofy

to summarize

  
  
  
 (load "evaluator-amb.scm") 
  
 (define (if-fail? exp) 
     (tagged-list? exp 'if-fail)) 
 (define (if-fail-cond exp) (cadr exp)) 
 (define (if-fail-alt exp) (caddr exp)) 
  
 (define (analyze-if-fail exp) 
     (let ((cproc (analyze (if-fail-cond exp))) 
           (aproc (analyze (if-fail-alt exp)))) 
         (lambda (env succeed fail) 
             (cproc env 
                    succeed 
                    (lambda () 
                         (aproc env succeed fail)))))) 

meteorgan

  
  
 ;; add this in analyze 
 ((if-fail? expr) (analyze-if-fail expr)) 
  
 ;; add those to amb evaluator 
 (define (if-fail? expr) (tagged-list? expr 'if-fail)) 
  
  (define (analyze-if-fail expr) 
   (let ((first (analyze (cadr expr))) 
         (second (analyze (caddr expr)))) 
    (lambda (env succeed fail) 
     (first env 
            (lambda (value fail2) 
             (succeed value fail)) 
            (lambda () 
             (second env succeed fail)))))) 
  

The success continuation needs to be (succeed value fail2) and not (succeed value fail). Otherwise, try-again will not return new values even when there are some left.

in other words,

 ;; 
 ;; 
            (lambda (value fail2) 
             (succeed value fail)) 

should just be changed to succeed.




codybartfast




(define try-expr cadr)
(define fail-expr caddr)

(define (analyze-if-fail exp)
  (let ((tproc (analyze (try-expr exp)))
        (fproc (analyze (fail-expr exp))))
    (lambda (env succeed fail)
      (tproc env succeed (lambda () (fproc env succeed fail))))))