采用一致规则,对IF操作,需先计算操作数,即使Y=0。 显然,此时我们不希望所有操作数被计值。 从而,我们有另一个规则:永不在应用操作之前计值操 作数 即,总是不计值地传递操作数,由作用操作决定什么时 候计值操作数—Lazy计值 然而,对此规则,实现在很多情况下是不实际的。比如: 如何仿真未计值操作数到操作的传递?这需要软件仿真。 这两种计值规则:积极和隋性(lazy),对应子程序参 数传递的按值和按名。 对表达式而言,没有简单的一致规则是完全令人满意的, 通常规则是混合的
采用一致规则,对IF操作,需先计算操作数,即使Y=0。 显然,此时我们不希望所有操作数被计值。 从而,我们有另一个规则:永不在应用操作之前计值操 作数。 即,总是不计值地传递操作数,由作用操作决定什么时 候计值操作数——Lazy计值。 然而,对此规则,实现在很多情况下是不实际的。比如: 如何仿真未计值操作数到操作的传递?这需要软件仿真。 这两种计值规则:积极和隋性(lazy),对应子程序参 数传递的按值和按名。 对表达式而言,没有简单的一致规则是完全令人满意的, 通常规则是混合的
问题二:副作用, Side effect o 表达式中使用有副作用的操作,一直是语言设计中的争 论点。考虑: a X fun(x)+a 对乘法:需先取a的右值并计值fm(x) 对加法:需取a的右值,并计算乘法 显然,我们希望只取a一次并应用到两个地方,而且fun(x) 的计值在取a的前或后并无区别。 但如fin有副作用,改变了a的值,则计值序成为关键。 如a值本为1,但fn执行后值为3,并改a为2。则表达 式可能的值为 1、顺序计值:1×3+2=5 2、取a一次:1×3+1=4 3、在取a前调用fun:2×3+2=8 执行序不同导致不同结果
问题二:副作用,Side effect。 表达式中使用有副作用的操作,一直是语言设计中的争 论点。考虑:a×fun(x)+a 对乘法:需先取a的右值并计值fun(x) 对加法:需取a的右值,并计算乘法。 显然,我们希望只取a一次并应用到两个地方,而且fun(x) 的计值在取a的前或后并无区别。 但如fun有副作用,改变了a的值,则计值序成为关键。 如a值本为1,但fun执行后值为3,并改a为2。则表达 式可能的值为: 1、顺序计值:1×3+2=5 2、取a一次:1×3+1=4 3、在取a前调用fun:2×3+2=8 执行序不同导致不同结果