[Issue 3971] Syntax & semantics for array assigns
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Tue Nov 15 23:57:18 PST 2011
http://d.puremagic.com/issues/show_bug.cgi?id=3971
--- Comment #19 from bearophile_hugs at eml.cc 2011-11-15 23:56:31 PST ---
(In reply to comment #18)
> See:
>
> http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=149289
This is from that post:
This also means this is currently accepted:
void main() {
int[3] a;
a = 1;
assert(a == [1, 1, 1]);
}
While this is not accepted:
void main() {
int[] b = new int[3];
b = 1;
assert(b == [1, 1, 1]); //Error: cannot implicitly convert expression (1)
of type int to int[]
}
I'd like D to require a[]=1 in that first case too.
I'd like the [] to be required every time an O(n) vector operation is done,
for:
- constancy with all other vector operations among two arrays, that require [];
- and to avoid unwanted (and not easy to spot in the code) O(n) operations;
- bugs and confusion in D newbies that don't have memorized all current special
cases.
On the other hand Don says that [] is only required for lvalues.
I think this boils to a new table like this:
Rhs is an array, is it compilable?
a / b a=b a[]=b a=b[] a[]=b[]
int[3u] / int[3u] FALSE true FALSE true
int[3u] / int[] FALSE true FALSE true
int[] / int[3u] FALSE true FALSE true
int[] / int[] true true true true
Rhs is a element, is it compilable?
a a=N a[]=N a[0..2]=N
int[3u] FALSE true true
int[] false true true
Now if there's a [] on the left, then it's an O(n) vector operation (like a
copy), otherwise it's O(1).
That also means:
void main() {
int[] a = new int[3];
int[] b = new int[3];
a = b; // OK, copies just array fat reference
}
void main() {
int[3] a, b;
a = b; // Not OK, hidden vector op
}
I am not sure this new table is fully correct, but it's a start. Fixes of
mistakes are welcomes.
-----------------------
This is an alternative proposal.
On the other hand this vector op syntax doesn't currently compile:
void main() {
int[3] a, b;
a[] += b;
}
So if array assign is seen as a normal vector op, then the [] is needed on the
right too:
Rhs is an array, is it compilable?
a / b a=b a[]=b a=b[] a[]=b[]
int[3u] / int[3u] FALSE FALSE FALSE true
int[3u] / int[] FALSE FALSE FALSE true
int[] / int[3u] FALSE FALSE FALSE true
int[] / int[] true FALSE FALSE true
Rhs is a element, is it compilable?
a a=N a[]=N a[0..2]=N
int[3u] FALSE true true
int[] false true true
Where the two cases with dynamic arrays are syntax errors to keep more
symmetry:
void main() {
int[] a = new int[3];
int[] b = new int[3];
a[] = b; // error
a = b[]; // error
}
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
More information about the Digitalmars-d-bugs
mailing list