为什么 "reduce" 在 Chapel 中是一个中缀运算符?
Why is "reduce" an infix operator in Chapel?
根据这个 manual 页面,我们可以使用 reduce
来执行缩减,例如
求和 (+):
var a = (+ reduce A) / num;
var b = + reduce abs(A);
var c = sqrt(+ reduce A**2);
和最大值 value/location:
var (maxVal, maxLoc) = maxloc reduce zip(A, A.domain);
这里,Chapel 将 reduce
定义为中缀运算符而不是函数(例如,reduce( A, + )
)。恕我直言,后一种形式似乎更具可读性,因为参数总是用括号分隔。所以我想知道这种选择是否有某种原因(例如,为了简化一些并行语法)或者只是历史问题(惯例)?
我会说答案是历史/惯例问题。 Chapel 的许多数组和域功能都深受华盛顿大学 ZPL 语言的启发,我相信这种语法是直接从 ZPL 合理地获取的。
当时,我们没有在 Chapel 中传递诸如函数和运算符之类的东西的想法,这可能是我们没有考虑更多基于函数的方法的原因之一。 (即使是现在,Chapel 中的 first-class 函数支持仍处于起步阶段,我不相信我们有办法传递运算符)。
我还要说,Chapel 是一种语言,它通常倾向于使用关键模式的语法,而不是更多地采用 "make everything look like a function / method call" 方法(例如,通过文字语法和几个关键运算符支持范围,而不是使用带有方法的对象类型)。
None这就是说这个选择显然是正确的或者不能再考虑了。
根据这个 manual 页面,我们可以使用 reduce
来执行缩减,例如
求和 (+):
var a = (+ reduce A) / num;
var b = + reduce abs(A);
var c = sqrt(+ reduce A**2);
和最大值 value/location:
var (maxVal, maxLoc) = maxloc reduce zip(A, A.domain);
这里,Chapel 将 reduce
定义为中缀运算符而不是函数(例如,reduce( A, + )
)。恕我直言,后一种形式似乎更具可读性,因为参数总是用括号分隔。所以我想知道这种选择是否有某种原因(例如,为了简化一些并行语法)或者只是历史问题(惯例)?
我会说答案是历史/惯例问题。 Chapel 的许多数组和域功能都深受华盛顿大学 ZPL 语言的启发,我相信这种语法是直接从 ZPL 合理地获取的。
当时,我们没有在 Chapel 中传递诸如函数和运算符之类的东西的想法,这可能是我们没有考虑更多基于函数的方法的原因之一。 (即使是现在,Chapel 中的 first-class 函数支持仍处于起步阶段,我不相信我们有办法传递运算符)。
我还要说,Chapel 是一种语言,它通常倾向于使用关键模式的语法,而不是更多地采用 "make everything look like a function / method call" 方法(例如,通过文字语法和几个关键运算符支持范围,而不是使用带有方法的对象类型)。
None这就是说这个选择显然是正确的或者不能再考虑了。