为什么在教堂中“减少”中缀运算符?

时间:2019-11-08 15:26:01

标签: reduction chapel

根据此manual页,我们可以使用reduce进行归约 总和(+):

var a = (+ reduce A) / num;
var b = + reduce abs(A);
var c = sqrt(+ reduce A**2);

和最大值/位置:

var (maxVal, maxLoc) = maxloc reduce zip(A, A.domain);

在这里,Chapel将reduce定义为中缀运算符,而不是函数(例如reduce( A, + ))。恕我直言,后一种形式似乎更具可读性,因为参数总是用括号分隔。因此,我想知道是出于某种原因(例如,简化一些并行语法)还是出于历史原因(惯例)?

1 个答案:

答案 0 :(得分:4)

我会说答案是历史/惯例问题。华盛顿大学的ZPL语言极大地激发了Chapel的许多数组和域功能,我相信这种语法是直接从ZPL直接获得的。

当时,我们没有在Chapel中传递诸如函数和运算符之类的概念,这可能是我们不考虑更多基于功能的方法的原因之一。 (即使现在,Chapel中的一流功能支持仍处于起步阶段,我不相信我们有办法传递运算符。)

我还要说的是,Chapel是一种通常支持键模式语法的语言,而不是采用更多的“使一切看起来像函数/方法调用”的方法(例如,范围通过文字语法和多个关键运算符,而不是使用带有方法的对象类型。

这并不是说选择显然是正确的,或者是无法重新考虑的。