将标量分配给元组

Assignment of scalar to a tuple

对于像x : 2*real这样的元组,它似乎支持各种元素操作,例如

var t = (1.0, 2.0);   // type = (real,real) or 2*real

writeln( t );               // (1.0, 2.0)
writeln( t + 0.1 );         // (1.1, 2.1)
writeln( t * 10.0 );        // (10.0, 20.0)
writeln( t * 10.0 + 1.0 );  // (11.0, 21.0)
writeln( t ** 2 );          // (1.0, 4.0)

但是将标量赋值给元组,例如

t = 0.0;   // my expected result: t = (0.0, 0.0)

报错:

error: Cannot assign to 2*real(64) from real(64)

禁止这样做是因为标量到元组的转换没有明确定义或不明确,还是可能出于其他原因?如果是这样,是否希望用户编写自定义赋值例程 ike proc =(t, x)(以重载 =)?

你好@voidwkr:我相信我们保守地选择在 Chapel 中将其设为非法,担心如果有人没有意识到左侧表达式是一个元组,可能会让他们大吃一惊。关于在左侧的异构元组的情况下应该做什么,也可能存在一些问题。

就是说,我还认为,鉴于 Chapel 支持的其他元组-标量组合,如您所见(更不用说数组 <-标量赋值),有理由支持此类赋值。

当对这样的问题有疑问时,我们通常会尝试采取保守的方法,因为如果我们后来决定我们错了,我们就不太可能破坏现有代码。如果您认为我们在这里做出了错误的选择,我鼓励您在 Chapel 的 GitHub 问题页面上提出功能请求,提出您的理由:https://github.com/chapel-lang/chapel/issues

正如您所指出的,支持此类分配的一种方法是提供您自己的 = 重载来处理这种情况,就像这样 (TIO):

var t = (1.0, 2.0);   // type = (real,real) or 2*real

t = 0.0;

writeln(t);

proc =(ref lhs: 2*real, rhs: real) {
  for l in lhs do
    l = rhs;
}