SICP問題4.1

3章が終了して4章開始。

元のlist-of-values

(define (list-of-values exps env)
  (if (no-operands? exps)
      '()
      (cons (eval (first-operand exps) env)
            (list-of-values (rest-operands exps) env))))

基盤のLispの評価の順と無関係に被演算子を左から右へ評価するlist-of-values

(define (list-of-values exps env)
  (if (no-operands? exps)
      '()
      (let ((first-eval-exp (eval (first-operand exps) env)))
        (cons first-eval-exp
              (list-of-values (rest-operands exps) env)))))

演算子を右から左へ評価するlist-of-values

(define (list-of-values exps env)
  (if (no-operands? exps)
      '()
      (let ((rest-eval-exps (eval (list-of-values (rest-operands exps) env))))
        (cons (eval (first-operand exps) env)
              rest-eval-exps))))