如何在 Chapel 中的域上进行就地“扩展”
How to do an in-place `expand` on a domain in Chapel
Chapel returns 新域中的 expand 命令。我想将域名增加一个
var d: domain(1) = {1..5};
writeln(d);
--{1..5}
expand(d)(1);
writeln(d);
--{1..6};
几个online experiments on domain
expansion:
有些按照记录工作,有些则不然:
var d: domain(1) = {1..5};
writeln( d ); // SET {1..5}
// {1..5}
var e: domain(1) = d.expand(1);
writeln( e ); // OK, DOMAIN d == {1..5} EXTENDED ON BOTH ENDS INTO {0..6}
// {0..6}
var AonD: [d] int;
AonD.push_back(1);
writeln( AonD.domain ); // OK, DOMAIN EXTENDED INDIRECTLY ON DESIRED END INTO {1..6}
// {1..6}
// var f: domain(1) = {1..5}; // NEW {1..5} - A NON-SHARED, NON-USED ( NON-MAPPED ) DOMAIN
// f.add(6); // FAILS v/s A PROMISE IN: http://chapel.cray.com/docs/master/builtins/internal/ChapelArray.html#ChapelArray.add
// f += 6; // FAILS
// writeln( f );
从 Chapel 1.15 开始,域上的 expand
方法没有就地选项。您需要将 expand
的结果分配给所需的域:
var eDom = {1..5};
eDom = eDom.expand(1);
writeln(eDom); // {0..6}
听起来 expand
并不是您想要的,因为 expand
会在每个维度的两个方向上增加域。要向矩形域添加一个索引,您可以为您的域分配一个域文字:
var rDom = {1..5};
const hi = rDom.last + 1;
rDom = {rDom.first..hi};
writeln(rDom); // {1..6}
对于不规则域,您可以使用 add
方法:
var aDom = {1, 3, 5, 7}; // an associative domain
aDom.add(9);
writeln(aDom.sorted()); // 1 3 5 7 9
请注意,您不能在矩形域上使用 add
方法。这在 Chapel 语言规范 version 0.983 的第 19.8.6 节中定义。
Chapel returns 新域中的 expand 命令。我想将域名增加一个
var d: domain(1) = {1..5};
writeln(d);
--{1..5}
expand(d)(1);
writeln(d);
--{1..6};
几个online experiments on domain
expansion:
有些按照记录工作,有些则不然:
var d: domain(1) = {1..5};
writeln( d ); // SET {1..5}
// {1..5}
var e: domain(1) = d.expand(1);
writeln( e ); // OK, DOMAIN d == {1..5} EXTENDED ON BOTH ENDS INTO {0..6}
// {0..6}
var AonD: [d] int;
AonD.push_back(1);
writeln( AonD.domain ); // OK, DOMAIN EXTENDED INDIRECTLY ON DESIRED END INTO {1..6}
// {1..6}
// var f: domain(1) = {1..5}; // NEW {1..5} - A NON-SHARED, NON-USED ( NON-MAPPED ) DOMAIN
// f.add(6); // FAILS v/s A PROMISE IN: http://chapel.cray.com/docs/master/builtins/internal/ChapelArray.html#ChapelArray.add
// f += 6; // FAILS
// writeln( f );
从 Chapel 1.15 开始,域上的 expand
方法没有就地选项。您需要将 expand
的结果分配给所需的域:
var eDom = {1..5};
eDom = eDom.expand(1);
writeln(eDom); // {0..6}
听起来 expand
并不是您想要的,因为 expand
会在每个维度的两个方向上增加域。要向矩形域添加一个索引,您可以为您的域分配一个域文字:
var rDom = {1..5};
const hi = rDom.last + 1;
rDom = {rDom.first..hi};
writeln(rDom); // {1..6}
对于不规则域,您可以使用 add
方法:
var aDom = {1, 3, 5, 7}; // an associative domain
aDom.add(9);
writeln(aDom.sorted()); // 1 3 5 7 9
请注意,您不能在矩形域上使用 add
方法。这在 Chapel 语言规范 version 0.983 的第 19.8.6 节中定义。