問題4.54 – SICP(計算機プログラムの構造と解釈)その226

問題4.54

pred-valuefalse の場合に失敗継続を呼び出す。

(define (analyze exp)
  (cond ((self-evaluating? exp)
         (analyze-self-evaluating exp))
        ;; 省略
        ((require? exp) (analyze-require exp))
        ;; 省略
        (else
          (error "Unknown expression type -- ANALYZE" exp))))

(define (require? exp) (tagged-list? exp 'require))

(define (require-predicate exp) (cadr exp))

(define (analyze-require exp)
  (let ((pproc (analyze (require-predicate exp))))
       (lambda (env succeed fail)
               (pproc env
                      (lambda (pred-value fail2)
                              (if (false? pred-value)
                                  (fail2)
                                  (succeed 'ok fail2)))
                      fail))))

実行結果

;;; Amb-Eval input:
(define (an-element-of items)
  (require (not (null? items)))
  (amb (car items) (an-element-of (cdr items))))

;;; Starting a new problem 
;;; Amb-Eval value:
ok

;;; Amb-Eval input:
(an-element-of '(1 2 3))

;;; Starting a new problem 
;;; Amb-Eval value:
1

;;; Amb-Eval input:
try-again

;;; Amb-Eval value:
2

;;; Amb-Eval input:
try-again

;;; Amb-Eval value:
3

;;; Amb-Eval input:
try-again

;;; There are no more values of
(an-element-of '(1 2 3))
計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
«
»