52700.fb2 Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 175

Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 175

⇒ e[ a 1/ x 1 . . . an/ xn]; s; H

f ;

Arg a 1 : … : Arg am : s;

H[ f → F U N ( x 1 . . . xn → e)]

⇒ p; s; H[ p → P AP ( f a 1 . . . am)]

при m ≥ 1; m < n; верхний элемент s

не является Arg; p – новый адрес

f ;

Arg an+1 : s;

H[ f → P AP ( g a 1 . . . an)]

⇒ g; Arg a 1 : … : Arg an : Arg an+1 : s; H

Рис. 10.8: Синтаксис STG

Первое правило выполняет этап “вставка”. Если мы видим применение функции, мы первым делом со-

храняем все аргументы в стеке. Во втором правиле мы вычислили значение f, оно оказалось функцией с

арностью n. Тогда мы добираем из стека n аргументов и подставляем их в правую часть функции e. Если

в стеке оказалось слишком мало аргументов, то мы переходим к третьему правилу и составляем частичное

применение. Последнее правило говорит о том как расшифровывается частичное применение. Мы вставляем

в стек все аргументы и начинаем вычисление функции g из тела P AP .

Вычисление STG | 161

f • a 1 . . . an;

s;

H[ f → F U N ( x 1 . . . xn → e)]

⇒ e[ a 1/ x 1 . . . an/ xn]; s; H

f k a 1 . . . am;

s;

H[ f → F U N ( x 1 . . . xn → e)]

⇒ e[ a 1/ x 1 . . . an/ xn]; ( • an+1 . . . am) : s; H

при m ≥ n

⇒ p; s; H[ p → P AP ( f a 1 . . . am)]

при m < n, p – новый адрес

f • a 1 . . . am;

s;

H[ f → T HU N K e]

⇒ f; ( • a 1 . . . am) : s; H

f k an+1 . . . am;

s;

H[ f → P AP ( g a 1 . . . an)]

⇒ g• a 1 . . . an an+1 . . . am; s; H

f ;

( • a 1 . . . an) : s;

H

⇒ f• a 1 . . . an; s; H

H[ f ] является F U N или P AP

Рис. 10.9: Синтаксис STG

Правила для стратегии вычисление-применение

Разберёмся с первыми двумя правилами. В первом правиле статическая арность f неизвестна, но зна-

чение f уже вычислено, и мы можем узнать арность по объекту F UN, далее возможны три случая. Число

аргументов переданных в функцию совпадает с арностью F UN, тогда мы применяем аргументы к правой

части F UN. Если в функцию передано больше аргументов чем нужно, мы сохраняем лишние на стеке. Если

же аргументов меньше, то мы создаём объект P AP . Третье правило говорит о том, что нам делать, если зна-