問題4.52 – SICP(計算機プログラムの構造と解釈)その224
2009年07月21日
問題4.52
第1引数が成功した場合はそのまま成功継続を返し、失敗した場合は第2引数の評価を行う。
(define (analyze exp) (cond ((self-evaluating? exp) (analyze-self-evaluating exp)) ;; 省略 ((if-fail? exp) (analyze-if-fail exp)) ;; 省略 (else (error "Unknown expression type -- ANALYZE" exp)))) (define (if-fail? exp) (tagged-list? exp 'if-fail)) (define (if-succeed exp) (cadr exp)) (define (if-failed exp) (caddr exp)) (define (analyze-if-fail exp) (let ((sproc (analyze (if-succeed exp))) (fproc (analyze (if-failed exp)))) (lambda (env succeed fail) (sproc env succeed ;; 第1引数の成功継続 (lambda () ;; 第1引数の失敗継続 (fproc env succeed fail))))))
実行結果
;;; Amb-Eval input:
(define (require p)
(if (not p) (amb)))
;;; Starting a new problem
;;; Amb-Eval value:
ok
;;; 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:
(if-fail (let ((x (an-element-of '(1 3 5))))
(require (even? x))
x)
'all-odd)
;;; Starting a new problem
;;; Amb-Eval value:
all-odd
;;; Amb-Eval input:
(if-fail (let ((x (an-element-of '(1 2 3 5 8))))
(require (even? x))
x)
'all-odd)
;;; Starting a new problem
;;; Amb-Eval value:
2
;;; Amb-Eval input:
try-again
;;; Amb-Eval value:
8
;;; Amb-Eval input:
try-again
;;; Amb-Eval value:
all-odd
;;; Amb-Eval input:
try-again
;;; There are no more values of
(if-fail (let ((x (an-element-of '(1 2 3 5 8)))) (require (even? x)) x) 'all-odd)
計算機プログラムの構造と解釈
posted with amazlet at 08.11.07
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
ピアソンエデュケーション
売り上げランキング: 6542
