re: Согласно Википедии "ALGOL68 использовал" процедуры "для достижения определенных пользователем операторов и процедур короткого замыкания".- Как это работает?
У Algol68-r0 (оригинальное / неизмененное определение) было два понятия, связанных с оценкой короткого замыкания.
Представьте, что кодер хочет определить оператор умножения матриц, которыйвыполнил «оценку короткого замыкания», поэтому, если левый аргумент является «нулевой» матрицей, то будет проведена дальнейшая оценка правой стороны ... Такое определение, определенное пользователем, может быть:
MODE MAT = FLEX[0,0]REAL;
OP ISZERO = (MAT a)BOOL: ¢ insert actual code here ¢ ~;
PRIO TIMESF = 7;
OP TIMESF = (MAT a, PROC MAT in b)MAT:
IF ISZERO a THEN a ELSE MAT b = in b; ¢ insert actual code here ¢ ~ FI;
MAT a = 0, b = 16, c = 25;
print(a TIMESF b TIMESF c) ¢ would print 0 without calculating 16*25 ¢
И наоборот, кодер хочет, чтобы левый и правый аргументы оценивались параллельно.Такие определяемые пользователем определения могут быть:
PRIO TIMESPAR = 7;
OP TIMESPAR = (MAT a, MAT b)MAT: ¢ insert actual code here ¢ ~;
Запятая говорит компилятору, что он может вычислять левую и правую руку в любом порядке или даже параллельно.(Это оставляет компилятору возможность оптимизировать оценку)
Или кодировщик может захотеть заставить оценку быть последовательной:
PRIO TIMESSEQ = 7;
OP TIMESSEQ = (MAT a; MAT b)MAT: ¢ insert actual code here ¢ ~;
В этом случае ";"называется «gomma», shofthand для «идти на запятую».
Algol68-r1 (пересмотрен в 1974 году, доступен в sourceforge для windows и linux) убрал все эти возможности, оставив кодер вручную / специально применять ""... например
Первый набор определений матриц одинаков:
MODE MAT = FLEX[0,0]REAL;
PRIO TIMESF = 7;
OP TIMESF = (MAT a, PROC MAT in b)MAT:
IF ISZERO a THEN a ELSE MAT b = in b; ¢ insert actual code here ¢ ~ FI;
MAT a = 0, b = 16, c = 25; ¢ 3 1x1 matrices are "widening" from REAL numbers ¢
Но использование отличается, обратите внимание на использование двух лямбд (MAT: b TIMES MAT:c) и (MAT: c):
print(a TIMESF MAT:b TIMESF MAT:c) ¢ would print 0 without calculating 16*25 ¢
Прозрачная депроцедура и расширение сохраняются в Algol68-r1.