Difference between revisions of "DIP34"

From D Wiki
Jump to: navigation, search
(DIP34: Static array literals (STILL EDITING -- don't read yet))
 
(8 intermediate revisions by the same user not shown)
Line 1: Line 1:
== DIP34: Static array literals ==
+
== DIP34: Static array literals (STILL EDITING -- don't read yet) ==
  
 
{| class="wikitable"
 
{| class="wikitable"
Line 24: Line 24:
 
|-
 
|-
 
|Links:
 
|Links:
 +
| [http://forum.dlang.org/post/ydyqguthbfxlnuxtqklx@forum.dlang.org] [https://github.com/Dgame/dmd/tree/static_array_literals implementation in progress]
 
|
 
|
 
|}
 
|}
  
 
== Abstract ==
 
== Abstract ==
This is a proposal for introducing static array literals.
+
This is a proposal for introducing static array literals, as follows:
 
+
<syntaxhighlight lang="d">
== Rationale ==
+
  auto x=[1,2,3]S;
Keeping track of improvement proposals is very hard and not well documented organized. Having a template (and a process) for such proposals can improve the situation significantly.
+
  static assert(is(typeof(x)==int[3]));
 +
</syntaxhighlight>
 +
The particular choice of 'S' can be discussed.
  
 
== Description ==
 
== Description ==
 
Currently, array literals such as  
 
Currently, array literals such as  
 +
<syntaxhighlight lang="d">
 
   auto x=[1,2,3];
 
   auto x=[1,2,3];
 +
</syntaxhighlight>
 
make x dynamic. To get a static array one needs to write:  
 
make x dynamic. To get a static array one needs to write:  
 +
<syntaxhighlight lang="d">
 
   int[3] x=[1,2,3];
 
   int[3] x=[1,2,3];
 +
</syntaxhighlight>
 
which is inconvenient for many reasons:
 
which is inconvenient for many reasons:
  * DRY principle (need to explicitly write 3 as the length and specify the type
+
  * it's not DRY (need to explicitly write 3 as the length and specify the type int)
int)
+
  * there's no easy way to pass a static array literal to a function accepting a static array; for example it requires:
  * no easy way to pass a static array litteral to a function accepting a static
+
<syntaxhighlight lang="d">
array; for example it requires:
 
 
   int[3] x=[1,2,3];  
 
   int[3] x=[1,2,3];  
 
   fun(x);
 
   fun(x);
 +
</syntaxhighlight>
  
 
+
Instead we propose the syntax:
Wouldn't it be simple to allow writing array literals using the syntax:
+
<syntaxhighlight lang="d">
 
   auto x=[1,2,3]S;  
 
   auto x=[1,2,3]S;  
where S stands for static?
+
</syntaxhighlight>
More generally the compiler should translate [x1,...,xn]S to: typeof(x1)[n]
+
where S stands for static. More generally the compiler should translate
 +
<syntaxhighlight lang="d">
 +
[x1,...,xn]S to: typeof(x1)[n]
 +
</syntaxhighlight>
  
 
Advantages:
 
Advantages:
  * static array litterals becomes as convenient as dynamic ones
+
  * static array literals becomes as convenient as dynamic ones
  * no confusion possible for the compiler; I believe this syntax doesn't clash
+
  * no confusion possible for the compiler; I believe this syntax doesn't clash with existing syntax.
with existing syntax.
+
  * In our previous example, no need to write an intermediate x: we can just write
  * In our previous example, no need to write an intermediate x: we can just
+
<syntaxhighlight lang="d">
write
 
 
   fun([1,2,3]S);
 
   fun([1,2,3]S);
or
 
 
   fun([1.0,2,3]S); //for example, if static array of doubles requested  
 
   fun([1.0,2,3]S); //for example, if static array of doubles requested  
 +
</syntaxhighlight>
  
 
* this would also prevent the common workaround hacks of the form:
 
* this would also prevent the common workaround hacks of the form:
 +
<syntaxhighlight lang="d">
 
   void fun(T...)(T x){} which accept fun(1,2,3): one could just write:
 
   void fun(T...)(T x){} which accept fun(1,2,3): one could just write:
 
   void fun(T,uint N)(in T[N]x){} or void fun(T,uint N)(T[N]x){}
 
   void fun(T,uint N)(in T[N]x){} or void fun(T,uint N)(T[N]x){}
 +
</syntaxhighlight>
  
* this could prevent inefficient intermediate code as reported in Issue 2356
+
* this could prevent inefficient intermediate code as reported in Issue 2356 and related, as it would be clear from "S" that a static is requested.  
and related, as it would be clear from "S" that a static is requested.  
 
  
 
* this could be used in expressions as well: auto x=[1,2,3]S+[4,5,6]S;
 
* this could be used in expressions as well: auto x=[1,2,3]S+[4,5,6]S;
  
This should be simpler than a previous request I've seen for int[$]x=[1,2,3];,
+
This should be simpler than a previous request I've seen for int[$]x=[1,2,3]; which still requires one to write the type explicitly.
which still requires one to write the type explicitly.
 
 
 
== Usage ==
 
<div style="padding: 1ex 1ex; background: #ffd;">This section has been adapted for MediaWiki.</div>
 
 
 
To start a new DIP you can go to Edit link and copy the source of this DIP, then go to [[DIPs|DIP index]] and add a new item in the list. The DIP number should be one more than the last DIP in the index (for example, if the DIP1 is the last DIP, your DIP should be DIP2). The link in the index should have the form: <nowiki>[[DIPx]]</nowiki>, Title, Status, resume. Where x is the DIP number, title is the DIP title and resume is a short description about the DIP.
 
 
 
Save the [[DIPs|DIP index]] page and click on the new red link. Now you are editing the new DIP you just created, now paste the copied source text from this template and replace all the you need.
 
 
 
Remember to update the metadata at the start of the DIP, and keep it as a Draft at the beginning. When your DIP is done, you should announce it in the News Group for discussion, with a subject like this: new DIPx: title (where one more time x is the DIP number and title is the DIP title).
 
 
 
You should always put you DIPs in the Public Domain (or a similarly permissive license but use Public Domain unless you're very sure of what you're doing).
 
 
 
== Recommendations ==
 
When writing a DIP, try not to express your opinion. DIPs should provide facts and be as objective as possible. Even when that's pretty hard, you can make the DIP look more objective by not using, for example, "I prefer XXX because YYY". If YYY is an objective advantage, write that in a more objective way, like "XXX can be a better option because YYY". Try to leave non-technical personal preferences aside; "XXX can be a better option because the syntax is nicer" is not good enough even when you don't say "I prefer".
 
 
 
Try not to include half-baked ideas. If you are not sure about something, leave it outside the DIP and write it on the NG announcement instead for further discussion. The idea can be added to the DIP in the future when it is in a better shape.
 
 
 
== Abstract ==
 
Make the abstract as descriptive as possible (while keeping it brief). From an abstract you should be able to tell what the DIP is about, you should introduce for every non-trivial concept a person should know for understanding the DIP (or provide links if you can't briefly describe those concepts in the abstract). Don't copy the title of the DIP to use it as an abstract. Ideally an abstract should be a paragraph 5 to 10 lines long.
 
 
 
== Rationale ==
 
Rationale should be complete. When the DIP tries to solve a problem, try to describe that problem as detailed as possible. If you have links to the NG describing the problem more deeply, used them. All the background information is welcome.
 
 
 
== NG Announcement ==
 
When posting the DIP announcement to the NG, please copy the abstract, so people can easily know what is it about and follow the link if they are interested.
 
 
 
  
 
== Copyright ==
 
== Copyright ==

Latest revision as of 18:28, 11 December 2013

DIP34: Static array literals (STILL EDITING -- don't read yet)

Title: Static array literals
DIP: 34
Version: 1
Status: Draft
Created: 2013-04-06
Last Modified: 2013-04-06
Author: Timothee Cour
Links: [1] implementation in progress

Abstract

This is a proposal for introducing static array literals, as follows:

   auto x=[1,2,3]S; 
   static assert(is(typeof(x)==int[3]));

The particular choice of 'S' can be discussed.

Description

Currently, array literals such as

   auto x=[1,2,3];

make x dynamic. To get a static array one needs to write:

   int[3] x=[1,2,3];

which is inconvenient for many reasons:

* it's not DRY (need to explicitly write 3 as the length and specify the type int)
* there's no easy way to pass a static array literal to a function accepting a static array; for example it requires:
   int[3] x=[1,2,3]; 
   fun(x);

Instead we propose the syntax:

   auto x=[1,2,3]S;

where S stands for static. More generally the compiler should translate

 [x1,...,xn]S to: typeof(x1)[n]

Advantages:

* static array literals becomes as convenient as dynamic ones
* no confusion possible for the compiler; I believe this syntax doesn't clash with existing syntax.
* In our previous example, no need to write an intermediate x: we can just write 
   fun([1,2,3]S);
   fun([1.0,2,3]S); //for example, if static array of doubles requested
  • this would also prevent the common workaround hacks of the form:
   void fun(T...)(T x){} which accept fun(1,2,3): one could just write:
   void fun(T,uint N)(in T[N]x){} or void fun(T,uint N)(T[N]x){}
  • this could prevent inefficient intermediate code as reported in Issue 2356 and related, as it would be clear from "S" that a static is requested.
  • this could be used in expressions as well: auto x=[1,2,3]S+[4,5,6]S;

This should be simpler than a previous request I've seen for int[$]x=[1,2,3]; which still requires one to write the type explicitly.

Copyright

This document has been placed in the Public Domain.