Structure and Interpretation of Computer Programs (http://mitpress.mit.edu/sicp/full-text/book/book-ZH-28.html#%_sec_4.3.3) のセクション 4.3.3 の演習 4.54 について質問があります。 )。この演習は、Amb エバリュエーターに関するものです。
演習は次のとおりです。
非決定論的プログラムの一部としてユーザーによって定義される、
require
を使用する通常の手続きとして実装できることを認識していなかった場合、特別な形式として実装する必要があったでしょう。amb
これには構文手順が必要です
(define (require? exp) (tagged-list? exp 'require))
(define (require-predicate exp) (cadr exp))
そして、ディスパッチの新しい条項
analyze
((require? exp) (analyze-require exp))
analyze-require
式を処理するプロシージャも同様require
です。の次の定義を完成させなさいanalyze-require
。(define (analyze-require exp) (let ((pproc (analyze (require-predicate exp)))) (lambda (env succeed fail) (pproc env (lambda (pred-value fail2) (if <??> <??> (succeed 'ok fail2))) fail))))
私は次のようにそれを完成させました:
(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) ;; or (fail)
(succeed 'ok fail2)))
fail))))
私の疑問は次のとおりです。
実行中に述語の値pred-value
が false の場合、require
失敗するはずです。つまり、失敗継続手順を呼び出す必要があります。しかし、私はそれが呼び出すべきか、それともを呼び出すべきかについて少し混乱してい(fail)
ます(fail2)
。どちらが正しいですか?