С аппликативным порядком, в каком порядке оцениваются аргументы? Слева направо или справа налево? - PullRequest
3 голосов
/ 22 января 2020

В SICP, часть 1.1.5 Модель замещения для применения процедуры Мне любопытно узнать аппликативный порядок оценки.

Я понимаю, что аппликативный порядок оценивает аргументы перед применением внешней процедуры .

Мой вопрос в том, в каком порядке он go использует аргументы?

Например,

(+ (+ 2 1) (/ 10 2))

Будет ли (+ 2 1) или (/ 10 2) вычисляться первым

Ответы [ 3 ]

2 голосов
/ 22 января 2020

Я предполагаю, что вы все еще в первой главе книги. Будьте уверены, что остальная часть книги объяснит вам это более подробно. На данный момент вас может заинтересовать эта сноска из раздела 3.2.1 Правила оценки :

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

В последующих главах обсуждается этот вопрос, все больше деталей. Например:

  • Упражнение 3.8 : "Определить простую процедуру f, такую, что оценка (+ (f 0) (f 1)) вернет 0, если аргументы + вычисляются из слева направо, но вернется 1, если аргументы оцениваются справа налево "
  • Упражнение 4.1 - изменить порядок оценки в метациклическом оценщике.
  • Раздел 5.4.1 Ядро оценщика явного управления (подраздел Оценка приложений процедуры ) - Показывает, как приложение процедуры может быть реализовано в явном контроле управления. Здесь вы можете ясно увидеть, как детали оценки аргумента l oop определяют порядок оценки.
1 голос
/ 22 января 2020

В вашем конкретном примере c, x вычисляется до y, поскольку два define вычисляются в последовательности.

В вызове функции, например: (+ (+ 2 3) (- 4 5)) порядок оценка (+ 2 3) и (- 4 5) не указана в схеме, как в другом ответе. в то время как в других языках Lisp, как в Common Lisp, слева направо.

1 голос
/ 22 января 2020

Не указано.

В подразделе procedure calls вы можете найти саму спецификацию.

Когда оценивается вызов процедуры, выражения оператора и операнда вычисляются (в неуказанном порядке), и результирующей процедуре передаются результирующие аргументы.

...