
168 Гл. 2. Основные понятия программирования
Однако в ряде языков программирования приняты меры для
возможности трактовки вводимых формул как подставляемых
выражений,
а не значений (алгол-60, вызов именем, англ.: сап
by name, — в противоположность обычному вызову значением).
В лиспе даже принципиально вызов всех параметров выпол-
няется
как вызов выражением. С этим, однако, как правило,
связана
потеря эффективности.
2.6.3.
Подпрограммы
в
качестве
результата
Если
подпрограммы допускаются в качестве параметра,
почему бы не допустить их и в качестве результата? Однако
вычислять по подпрограмме всё-таки значительно проще, чем
вычислять подпрограмму. Поэтому здесь мы рассмотрим лишь
простейший
случай, когда подпрограмма образуется из некото-
рой
другой подпрограммы путём фиксации одного или несколь-
ких параметров. Нам уже приходилось встречаться с этим в
некоторых случаях вложения — в последний раз в 2.6.1 (вло-
жение
invert
в inv), а раньше, скажем, в
2.4.1.3
(при вычис-
лении
isprim).
Из подпрограммы Her (см.
2.6.1)
фиксацией rho
получается подпрограмма с функциональным типом (int, int) int.
В общем случае мы должны были бы написать '•
2
funct
genitor
=
(funct
(int, int) int rho)
funct
(int, int) int:
(int a, int n со n^ 1 со) int:
iter
(rho,a,n).
Посредством вызова
genitor
(plus)
получаем обозначаемый через
mult
3
алгоритм обычного умно-
жения:
funct
mult
= (int a, int га со я ^ 1 со) int:
if n= 1
then
a
else
plus(a,mult
(a,n— 1)) fi,
а двойной вызов
genitor(genitor(plus)),
т. е. вызов
genitor
(mult), даёт обозначаемый через
pow
4
алго-
ритм обычного возведения в степень
funct
pow = (int a, int п со п^ 1 со) int:
if n= 1
then
a
else
mult(a,pow(a,n—
1) fi.
1
Конструкции подобного рода в паскале не предусмотрены, а в симуле
и
алголе-68 допустимы лишь с оговорками; они имеют законную силу й
Лямбда-исчислении Чёрча.
2
Ниже
genitor
и gen — от английского (или, точнее, латинского) genitor
(родитель, отец). •— Прим. изд. ред.
* От multiplication (умножение). — Прим. изд. ред.
4
От power (степень). — Прим. изд. ред.