Нормальный порядок и аппликативный порядок оценки в Схеме - PullRequest
4 голосов
/ 22 июня 2010

Для 1-го примера, приведенного на сайте: View-Site , я понимаю, что нормальный заказ оценивается в [6;1;1], а аппликативный заказ оценивается в [6;2;2]

Может кто-нибудь подтвердитьмоя оценка?

С уважением,
Darkie

1 Ответ

3 голосов
/ 22 июня 2010

Хорошо, давайте пройдемся по шагам оценки (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).

...