重新:根据维基百科“Algol68的使用的‘proceduring’来实现用户定义 短路运营商&程序”。 - 这个怎么用?
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”,适用于“逗逗”。
Algol68的-R1(修订于1974年,可在SourceForge上的Windows和Linux),删除了所有这些能力离开编码器,手动/特别适用“proceduring” ......如
第一组矩阵的定义是相同的:
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 ¢
但使用不同的是,注意使用两个lambda表达式(MAT:b乘以MAT:C)的和(MAT:C):
print(a TIMESF MAT:b TIMESF MAT:c) ¢ would print 0 without calculating 16*25 ¢
透明在Algol68-r1中保留了去核和扩大的功能。