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

問題4.1

まず、gauche でそれぞれの評価順の場合の手続きを作って確かめてみる。

(define val 10)

(define expression '((set! val (+ val 2)) (set! val (* val 2))))

左から右に評価する場合

(define (list-of-values-left-to-right exps)
  (if (null? exps)
      '()
      (let ((first-eval (eval (car exps) (interaction-environment))))
           (cons first-eval
                 (list-of-values-left-to-right (cdr exps))))))

(list-of-values-left-to-right expression)
gosh> (12 24)

右から左に評価する場合

(define (list-of-values-right-to-left exps)
  (if (null? exps)
      '()
      (let ((first-eval (list-of-values-right-to-left (cdr exps))))
           (cons (eval (car exps) (interaction-environment))
                 first-eval))))

(list-of-values-right-to-left expression)
gosh> (22 20)

上手く動いたようなので、これをもとにして問題の list-of-values を作る。

;; 被演算子を左から右へ評価する list-of-values
(define (list-of-values exps env)
  (if (no-operands? exps)
      '()
      (let ((first-eval (eval (first-operand exps) env)))
           (cons first-eval
                 (list-of-values (rest-operands exps) env)))))

;; 被演算子を右から左へ評価する list-of-values
(define (list-of-values exps env)
  (if (no-operands? exps)
      '()
      (let ((first-eval (list-of-values (rest-operands exps) env)))
           (cons (eval (first-operand exps) env)
                 first-eval))))
計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
«
»