Использует ли интерпретатор DrRacket оценку нормального порядка на основе упражнения SICP 1.5? - PullRequest
6 голосов
/ 12 декабря 2010

Необходимо принять решение на основе значения:

(тест 0 (p))

, где тест определяется как:

(define (test x y)
  (if (= x 0)
      0
      y))

и p определяется как:

(define (p) (p))

Когда я оцениваю (test 0 (p)), интерпретатор заходит в бесконечный цикл, предполагая, что он оценивает p.Это показывает оценка нормального порядка , потому что операнды оцениваются перед заменой параметров.SICP говорит, что LISP использует оценку аппликативного порядка.

1 Ответ

13 голосов
/ 12 декабря 2010

Это показывает оценка нормального порядка , потому что операнды вычисляются перед заменой параметров

На самом деле вы ошиблись.Аппликативный порядок - это когда операнды вычисляются первыми.Нормальный порядок - это когда аргументы подставляются в выражение без оценки.

Таким образом, ракетка использует аппликативный порядок, потому что, как вы сказали, аргументы оцениваются первыми (если только вы не используете «Ленивую ракетку», в этом случае она использует call-by-не нужна ленивая оценка, которая похожа на нормальный порядок, за исключением того, что каждый аргумент вычисляется не более одного раза).

...