問題4.51 – SICP(計算機プログラムの構造と解釈)その223
2009年07月20日
問題4.51
変数を元の値に戻す失敗継続(p257 analyze-assignment
の注釈*2*)を、元の値に戻さずにそのまま失敗を継続させる。
(define (analyze exp) (cond ((self-evaluating? exp) (analyze-self-evaluating exp)) ;; 省略 ((passignment? exp) (analyze-permanent-assignment exp)) ;; 省略 (else (error "Unknown expression type -- ANALYZE" exp)))) (define (passignment? exp) (tagged-list? exp 'permanent-set!)) (define (analyze-permanent-assignment exp) (let ((var (assignment-variable exp)) (vproc (analyze (assignment-value exp)))) (lambda (env succeed fail) (vproc env (lambda (val fail2) (set-variable-value! var val env) (succeed 'ok fail2)) fail))))
permanent-set!
を使った場合の実行結果
;;; 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: (define count 0) ;;; Starting a new problem ;;; Amb-Eval value: ok ;;; Amb-Eval input: (let ((x (an-element-of '(a b c))) (y (an-element-of '(a b c)))) (permanent-set! count (+ count 1)) (require (not (eq? x y))) (list x y count)) ;;; Starting a new problem ;;; Amb-Eval value: (a b 2) ;;; Amb-Eval input: try-again ;;; Amb-Eval value: (a c 3) ;;; Amb-Eval input: try-again ;;; Amb-Eval value: (b a 4) ;;; Amb-Eval input: try-again ;;; Amb-Eval value: (b c 6) ;;; Amb-Eval input: try-again ;;; Amb-Eval value: (c a 7) ;;; Amb-Eval input: try-again ;;; Amb-Eval value: (c b 8) ;;; Amb-Eval input: try-again ;;; There are no more values of (let ((x (an-element-of '(a b c))) (y (an-element-of '(a b c)))) (permanent-set! count (+ count 1)) (require (not (eq? x y))) (list x y count))
set!
を使った場合の実行結果
;;; Amb-Eval input: (let ((x (an-element-of '(a b c))) (y (an-element-of '(a b c)))) (set! count (+ count 1)) (require (not (eq? x y))) (list x y count)) ;;; Starting a new problem ;;; Amb-Eval value: (a b 1) ;;; Amb-Eval input: try-again ;;; Amb-Eval value: (a c 1) ;;; Amb-Eval input: try-again ;;; Amb-Eval value: (b a 1) ;;; Amb-Eval input: try-again ;;; Amb-Eval value: (b c 1) ;;; Amb-Eval input: try-again ;;; Amb-Eval value: (c a 1) ;;; Amb-Eval input: try-again ;;; Amb-Eval value: (c b 1) ;;; Amb-Eval input: try-again ;;; There are no more values of (let ((x (an-element-of '(a b c))) (y (an-element-of '(a b c)))) (set! count (+ count 1)) (require (not (eq? x y))) (list x y count))
計算機プログラムの構造と解釈
posted with amazlet at 08.11.07
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
ピアソンエデュケーション
売り上げランキング: 6542