さかもとのブログ

つらつらと

SICP演習問題4.1

ついに4章に入りました.

いきなり演習問題がわからず,答えを参照した.
いつもお世話になっております.

letを使って先に評価しちゃうのか.そうかそうだな.それならどれが先かが明らかだ.

;;excercise4.1
;;解答参照
(define val 10)
(define expression (cons (set! val (+ val 2)) (set! val (* val 2))))
expression
;=> (12 . 24)
;つまりGaucheでは左から右に評価される

;;評価用
(define expression '((set! val (+ val 2)) (set! val (* val 2))))
(eval expression (interaction-environment))

;from left to right
(define no-operands? null?)

(define first-operand car)

(define rest-operands cdr)

(define (list-of-value-from-left-to-right exps env)
  (if (no-operands? exps)
      '()
      (let ((first-exp (eval (first-operand exps) env)))
        (cons first-exp
              (list-of-value-from-left-to-right (rest-operands exps) env)))))

;from right to left
(define (list-of-value-from-right-to-left exps env)
  (if (no-operands? exps)
      '()
      (let ((first-exp (list-of-value-from-right-to-left (cdr exps) env)))
        (cons (eval (first-operand exps) env)
              first-exp))))

(list-of-value-from-left-to-right expression (interaction-environment))
;=> (12 24)
(list-of-value-from-right-to-left expression (interaction-environment))
;=> (22 20)