Порядок вычисления аргументов функции


Из SICP:

Упражнение 3.8

Когда мы определили модель оценки в разделе 1.1.3, мы сказал, что первым шагом в оценке выражение для оценки его подвыражения. Но мы никогда не указан порядок, в котором подвыражения должны быть оценены (например, слева право или справа налево). Когда мы ввести назначение, порядок какие аргументы в процедуры оценку можно изменить результат. Определить простую процедуру Ф таких, что оценка (+ (е 0) (Ф 1)) возвращает 0, если аргументы + вычисляются слева направо, но вернет 1, если аргументы оценивали справа налево.

Я написал это решение:

(define it false)
(define (f x)
  (if it
      it
      (begin (set! it (/ x 2)) it)))

(+ (f 1) (f 0))

Есть ли лучший способ?



394
2
задан 19 мая 2011 в 03:05 Источник Поделиться
Комментарии
1 ответ

Ваш код возвращает 1/2, если (ф 0) вычисляется первый, не 0. Лучше всего было бы вернуться к последнему аргументу в е, по умолчанию 0.

(define last 0)
(define (f x)
(define temporary last)
(set! last x)
temporary
)

При (+ (Е 0) (Ф 1)) вычисляется с (ф 0) во-первых, исполнение выглядит следующим образом:


  1. Ф называется с 0

  2. временное значение 0 (по умолчанию последняя)

  3. последнее имеет значение 0 (аргумент Ф)

  4. временные (0) возвращается

  5. Ф называется с 1

  6. временные устанавливается в 0

  7. последнее имеет значение 1

  8. временные (0) возвращается

  9. 0+0=0

Если (Ф 1) вычисляется первым, затем исполнение выглядит следующим образом:


  1. Ф называется с 1

  2. временное значение 0 (по умолчанию последняя)

  3. последнее имеет значение 1 (аргумент Ф)

  4. временные (0) возвращается

  5. Ф называется с 0

  6. временное значение 1

  7. последнее имеет значение 0

  8. временное (1) возвращается

  9. 0+1=1

2
ответ дан 19 мая 2011 в 08:05 Источник Поделиться