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

問題4.26

unless 式を if 式に変換する手続き unless->if を作り、導出された式として実装する。
ここでは4.1.7節の評価器に実装する。

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

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

(define (unless-predicate exp) (cadr exp))

(define (unless-consequent exp) (caddr exp))

(define (unless-alternative exp)
  (if (not (null? (cdddr exp)))
      (cadddr exp)
      #f))

(define (unless->if exp)
  (make-if (unless-predicate exp)
           (unless-alternative exp)
           (unless-consequent exp)))

実行結果

;;; M-Eval input:
(define (factorial n)
  (unless (= n 1)
          (* n (factorial (- n 1)))
          1))

;;; M-Eval value:
ok

;;; M-Eval input:
(factorial 5)

;;; M-Eval value:
120
計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
«
»