Title here
Summary here
// Slices are an important data type in Chapel, giving
// a more powerful interface to sequences than arrays.
use IO;
proc main() {
// Unlike arrays, slices in Chapel are created using the 'new' keyword
// and are of type 'domain'. An uninitialized domain is empty.
var s: domain(1) = {1..0};
writeln("uninit: ", s, " ", s.size == 0, " ", s.size == 0);
// To create an empty domain with non-zero size, we can specify a range.
// Here we create a domain of size 3.
s = {1..3};
writeln("emp: ", s, " len: ", s.size, " cap: ", s.size);
// We can set and get elements using array notation.
var a: [s] string;
a[1] = "a";
a[2] = "b";
a[3] = "c";
writeln("set: ", a);
writeln("get: ", a[3]);
// 'size' returns the length of the domain as expected.
writeln("len: ", s.size);
// To add elements to a domain, we can use the '+=' operator.
s += 4..5;
a[4] = "d";
a[5] = "e";
writeln("apd: ", a);
// Domains can be copied. Here we create a new domain 'c' of the same size as 's'.
var c = s;
var b: [c] string = a;
writeln("cpy: ", b);
// Domains support slicing with the syntax domain[low..high].
var l = s[3..5];
writeln("sl1: ", a[l]);
// This slices up to (but excluding) index 5.
l = s[1..4];
writeln("sl2: ", a[l]);
// And this slices from index 3 to the end.
l = s[3..];
writeln("sl3: ", a[l]);
// We can declare and initialize a domain and its associated array in a single line.
var t = {1..3};
var tArr: [t] string = ["g", "h", "i"];
writeln("dcl: ", tArr);
// Chapel doesn't have a built-in 'slices' module, but we can compare arrays directly.
var t2 = {1..3};
var t2Arr: [t2] string = ["g", "h", "i"];
if tArr == t2Arr then
writeln("t == t2");
// Domains can be multi-dimensional. The size of inner domains can vary.
var twoD: [1..3] domain(1);
for i in 1..3 {
twoD[i] = {1..i};
}
var twoDArr: [1..3] [twoD[1..3]] int;
for i in 1..3 {
for j in 1..i {
twoDArr[i][j] = i + j - 1;
}
}
writeln("2d: ", twoDArr);
}
This Chapel code demonstrates concepts similar to Go’s slices, using Chapel’s domains and arrays. Here are some key points:
domain(1)
type is used to create one-dimensional domains, which can be resized.var a: [s] string;
.size
instead of len
to get the length of a domain or array.+=
operator.Note that while the concepts are similar, the syntax and some specifics differ between Go and Chapel. This example aims to showcase Chapel’s equivalent features for working with sequences of data.