延迟参数求值

通常,当调用函数时,DScript 在进入函数之前对输入参数求值。例如,在表达式中:

f(2+3)

DScript 首先对表达式 2+3 求值得到 5,然后对表达式 f(5) 求值。假设想要延迟对参数的求值,让函数 f 决定是否以及何时对表达式求值。例如,假设想要构建一个行为类似 IF 原语的函数。IF 具有以下格式:

 IF( conditional, trueexpression, falseexpression )

参见关于 If 语句

根据 conditional 的值,对 trueexpressionfalseexpression 求值。但在任何情况下都不会对两个表达式都求值。

可以通过如下定义来正确获取函数的返回值:

IF(cond,a,b):={
  if(cond)
    return a;
  else
    return b;
}

但是,此定义的问题在于所有输入参数在进入函数 IF 之前都会被求值。因此,也会产生对 a 和 b 都求值的副作用。例如,

IF(true,say("True"),say("False"))

会同时显示 True 和 False。

要使输入参数的求值延迟,请在参数声明前加上 & 符号(@),如下所示:

IF(cond,@a,@b):={
  if(cond)
    return a;
  else
    return b;
}

现在传递给函数的是指向参数表达式的指针。这使得参数仅在函数体内被求值时才进行求值。