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

問題4.9

"[jfriends:00504] SICP 読書会 第17回議事録" の do の実装を参考にして while を実装してみる。

(define (eval exp env)
  (cond ((self-evaluating? exp) exp)
        ; 省略
        ((while? exp) (eval (while->let exp) env))
        ; 省略
        (else
          (error "Unknown expression type -- EVAL" exp))))

;;;; while
(define (while? exp) (tagged-list? exp 'while))

(define (while-predicate exp) (cadr exp))

(define (while-body exp) (cddr exp))

(define (while->let exp)
  (let ((predicate (while-predicate exp))
        (body (while-body exp)))
       (list 'let 'while-loop '()
             (make-if predicate
                      (append (cons 'begin body)
                              (list (cons 'while-loop '())))
                      'true))))

実行結果

;;; M-Eval input:
(define i 0)

;;; M-Eval value:
ok
;;; M-Eval input:
(while (< i 10)
(set! i (+ i 1))
(print i))
1
2
3
4
5
6
7
8
9
10

;;; M-Eval value:
#t

問題4.10

パス

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