16.13.3 语义

Reduce Actions

ReduceAction通过合并集合(collection)中的元素把一个集合缩减为一个单值。输入集合通过collection InputPin给出。reducer行为必须有两个in参数和一个out或return参数,类型要与集合元素的类型相同。它有一个result OutputPin也与集合元素类型相同。

执行引擎可以定义不同种类的集合类型(set、bag等等),其中的单独实例可以从元素值来构建,并在之后通过它们来获取那些元素值。这样的一个集合作为一个单一值封装在一个token中被传递。此时,ReduceAction的collection InputPin应该以集合的类型作为它的类型并且multiplicity为1。

作为另一种选择,执行引擎可以把传递给它的一组tokens中的值一起放在一个InputPin中来隐含地支持集合。此时,ReduceAction的集合InputPin应该与集合的元素具有相同的类型且multiplicity上限大于1(通常为*)。

ReduceAction通过在输入集合的一个中间拷贝上重复的调用reducer行为来执行。对于reducer的每一次调用,两个元素从中间集合上删除来作为调用的(输入)参数。从调用返回的值被插入到中间集合内,因此,每次调用它的规模减少1,之后reducer行为又一次被调用。这个过程一直持续到集合中只剩下一个元素。这个元素被放于result OutputPin之后ReduceAction执行结束。

如果输入集合是无序的,或者如果InputPin的isOrdered为假,那么对于reducer的调用选择哪几个元素是不确定的。如果输入集合有序或者如果InputPin的isOrdered为真,那么总是中间集合的前两个元素作为reducer调用的参数,调用的结果总是作为集合的第一个元素被插入。

如果reducer行为是一个可交换和可结合操作,那么一个无序的集合或者isOrdered=false通常不会影响ReduceAction的结果,这给了reduction计算极大的自由度。举个例子,加法是可交换的(a+b=b+a)和可结合的((a+b)+c=a+(b+c)),因此,使用加法来缩减一个集合不管每次调用选择哪些元素结果都是相同的。如果reducer行为不是一个可交换和可结合的操作(例如矩阵乘法),那么中间集合上元素的次序将会影响reduction计算的结果。如果这种情况下希望避免不确定性,那么集合应该是有序的或者isOrdered设置为真,这样reducer行为将根据集合次序应用在两个相邻的元素对上。

如果reducer行为有副作用(例如调用会相互影响),那么isOrdered=false的ReduceAction的集合是不可预测的。

Raise Exception Actions

RaiseExceptionAction导致一个异常出现。RaiseExceptionAction总是以产生一个异常来结束。在exception InputPin上给出的值就是产生的异常。

如果RaiseExceptionAction自身有一个异常处理器(参见15.5)与所产生的异常匹配,那么异常会被改处理器所捕获。否则,异常传播到包含该动作的上一层结构化活动节点中。如果这个结构化活动节点有一个与该异常匹配的异常处理器,那么异常被该处理器所捕获,否则异常继续向外传播。

当异常从一个结构化活动节点传播出去(包括被该节点的异常处理器所捕获),该结构化活动节点终止。如果异常被该结构化活动节点的一个异常处理器所捕获,那么在处理器执行结束后,控制和对象tokens按照15.5.3的描述从该结构化活动节点被提交。否则,该结构化活动节点不影响任何控制tokens,它的OutputPins也不影响任何对象tokens。

如果异常在RaiseExceptionAction执行所在行为的任何层次上都没有被一个异常处理器所捕获,那么该行为终止。如果该行为是同步调用的,异常传播给该行为的调用者(可参加16.3.3由同步调用CallAction产生异常的讨论)。如果该行为是异步调用的,那么异常传播结束,行为执行终止。

results matching ""

    No results matching ""