Hi Chapel Devs --
This is a request for a proposed change to the interpretation of Chapel
programs, which anyone invested in the language should give a quick look
at and then respond to two questions below. There's also a patch to
implement the change (which I'll need a reviewer for as soon as we verify
that we have consensus on it).
For some time now, Chapel has permitted a domain to be specified either
by naming it, e.g.:
const D = {1..n};
const DistD = D dmapped Block(...);
forall i in DistD ...
or by wrapping it in an extraneous set of curly brackets:
const D = {1..n};
const DistD = {D} dmapped Block(...);
forall i in {DistD} ...
The reasons for this are somewhat obscure (and arguably indefensible), but
relate to (1) a precedent set in ZPL, (2) the days when we used square
brackets for domain literals, and (3) to the use of anonymous domains in
array declarations without curly brackets (i.e., a pure implementation of
Chapel would require
var A: [{1..n, 1..n}] real;
rather than permitting the shorthand:
var A: [1..n, 1..n] real;
I'd forgotten about this anomaly until doing cleanup on iterations over
anonymous domains the other week when I encountered some instances of it.
Over lunch, Vass pointed out that cleaning this up should be fairly easy
so I took it on as a five-minute fix (TM).
I'm proposing that instead, we interpret {D} (where 'D' is a domain) as an
associative domain of domain values, containing one index 'D' which seems
more consistent with the current language definition.
In implementing this, I also realized for the first time (or re-realized
something I'd forgotten), that as an extension to the sugaring of
anonymous domains in array declarations, that we permit:
var A: [1, 2, 4] real;
to mean "A is declared over an anonymous associative domain {1, 2, 4}. I'm
not sure whether this is a good thing or not. I think the argument for
sugaring this case is weaker since programmers from C and Fortran won't
have a corresponding concept that they'll expect to work in Chapel, and I
think in this case the curly brackets make the intention clearer:
var A: [{1, 2, 4}] real;
That said, my patch does not impact this behavior -- it's more a question
for future five-minute fixes (TM) because it would be similarly
straightforward.
So, the two questions are:
1) Should we interpret {D} as an anonymous associative domain of domains
rather than simply a reference to domain 'D'?
2) Should we require curly brackets for anonymous domains in array
types that are not rectangular / defined by a list of ranges?
And if you're not interested in reviewing the patch, you can stop there.
-----
The heart of the patch is a simple change: We have traditionally
supported a routine, chpl__buildDomainExpr() which creates a domain from
whatever is passed it. One of the overloads took a domain and simply
returned it which is what caused '{D}' to evaluate to 'D'. So the idea
behind this change is to remove that overload.
A little more work is required, however, because the same call is used to
build the domain for an array type like '[D] real' and in this case, we
want to permit a domain like 'D' to be used. So what I did was to split
this call into two calls:
chpl__buildDomainExpr() : does what it has, but without the domain
overload now
chpl_ensureDomainExpr() : used in the array type signature context
to make sure that the expression is a
domain. In this context, if the thing
is a domain, we simply return it. In
all other cases, we forward the args to
chpl__buildDomainExpr()
>From there, the only other change was to switch calls to
chpl__buildDomainExpr() in the array type signature case (which was most
of them) over to chpl__ensureDomainExpr(), and to rewrite any tests that
were relying on '{D}' evaluating to 'D'.
I also added a test to demonstrate the "anonymous associative domain in an
array declaration" issue for consideration.
Note that to only permit rectangular domains to have their curly brackets
dropped in the array declaration context, we'd simply need to restrict the
type signatures permitted for chpl_ensureDomainExpr(), I believe. And we
could generate an error overload for the other cases.
Thanks,
-Brad
------------------------------------------------------------------------------
CenturyLink Cloud: The Leader in Enterprise Cloud Services.
Learn Why More Businesses Are Choosing CenturyLink Cloud For
Critical Workloads, Development Environments & Everything In Between.
Get a Quote or Start a Free Trial Today.
http://pubads.g.doubleclick.net/gampad/clk?id=119420431&iu=/4140/ostg.clktrk
_______________________________________________
Chapel-developers mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/chapel-developers