Назначение скаляра на кортеж - PullRequest
3 голосов
/ 17 января 2020

Для кортежа, такого как 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)

выдает ошибку:

ошибка: невозможно присвоить 2 * вещественное (64) из действительного (64)

Это запрещено, поскольку преобразование скаляра в кортеж не является четко определенным или неоднозначным, или, возможно, по другим причинам? Если да, то должен ли пользователь написать пользовательскую процедуру назначения ike proc =(t, x) (для перегрузки =)?

1 Ответ

2 голосов
/ 18 января 2020

Привет @voidwkr: Я считаю, что мы решили сделать это незаконно в Часовне консервативно, опасаясь, что если кто-то не поймет, что выражение левой стороны является кортежем, оно может застать их врасплох. Кроме того, потенциально существует небольшой вопрос относительно того, что следует делать в случае гетерогенного кортежа с левой стороны.

Тем не менее, я также думаю, что есть аргумент в поддержку такой присваивания, заданные другими кортежно-скалярными комбинациями, которые поддерживает Chapel, как вы заметили (не говоря уже о массиве <-скалярных присваиваний). </p>

Если вы сомневаетесь в подобных вопросах, мы часто пытаемся придерживаться консервативного подхода, потому что тогда если позже мы решим, что мы не правы, мы реже сломаем существующий код. Если вы считаете, что мы сделали неправильный выбор, я бы рекомендовал вам открыть запрос на функцию на странице проблем GitHub в Chapel, указав свой аргумент: 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...