Хорошо, давайте пройдемся по шагам оценки (cons res v)
с оценкой нормального порядка:
v
было определено как (cons a (cons b ’()))
, поэтому мы имеем cons res (cons a (cons b ’()))
.res
определяется как (foo ...)
, поэтому у нас есть
(cons (foo (begin (set! a (+ a 1)) a)
(begin (set! b (* b 2)) b))
(cons a (cons b ’())))
Наконец, foo x y
определяется как (+ x y y)
, поэтому путем замены (begin (set! a (+ a 1)) a)
для x
и (begin (set! b (* b 2)) b)
для y
, мы получаем:
(cons (+ (begin (set! a (+ a 1)) a)
(begin (set! b (* b 2)) b)
(begin (set! b (* b 2)) b))
(cons a (cons b ’())))
Итак, давайте оценим это: чтобы получить результат от cons, нам сначала нужно оценить его первый аргумент, (+ ...)
.Итак, сначала нам нужно оценить первый аргумент +
, который равен (begin (set! a (+ a 1)) a)
.Это значение равно 2, поэтому значение a
теперь равно 2, а первый аргумент +
также равен 2. Теперь мы делаем то же самое со вторым аргументом.Это также оценивает 2 и устанавливает b в 2. Третий аргумент снова (begin (set! b (* b 2)) b)
, поэтому значение b
теперь равно 4, а третий аргумент 4. Таким образом, первый аргумент cons
является результатом (+ 2 2 4)
, что равно 8, а значения a
и b
равны 2 и 4.
Теперь нам нужно оценить второй аргумент, (cons a (cons b ’()))
.Так как значения a
и b
равны 2 и 4, конечный результат равен (8 2 4)
.