DMD 1.039 and 2.023 releases

Yigal Chripun yigal100 at gmail.com
Fri Jan 16 13:26:42 PST 2009


bearophile wrote:
> Bill Baxter:
>> To me it's hard to see those variable declarations as being anything
>> other than scoped to the blocks they're in.
>> So all I'm saying is if we could have some different delimiters for
>> non-scope blocks then it might be nice, and make it easier to see when
>> scopes are ending and when they are not.
>
> *Now* I understand, and I see your point.
> It's the usual problem: ASCII doesn't have enough ways to represent containers and delimiters :-)
>
> So if this is your original code (I have improved your indentations and improved readability a little):
>
> void doSomething(T)(int i) {
>      if (i == 0) {
>          static if (is(T == A)) {
>              A.SomeAlias x;
>          } else static if(is(T == B)) {
>              B.SubType x;
>          } else {
>              T x;
>          }
>
>          x = ... whatever
>     }
>     else
>          int y = x;
> }
>
>
> This can be the new version following your idea:
>
> void doSomething(T)(int i) {
>      if (i == 0) {
>          static if (is(T == A)) ::
>              A.SomeAlias x;
>          :: else static if(is(T == B)) ::
>              B.SubType x;
>          :: else ::
>              T x;
>          ::
>
>          x = ... whatever
>     }
>     else
>          int y = x;
> }
>
>
> But the problem is that :: don't have a head and tail, so the code is even less easy to read.
>
> This version uses (* ... *), used in Pascal to denote comments:
>
> void doSomething(T)(int i) {
>      if (i == 0) {
>          static if (is(T == A)) (*
>              A.SomeAlias x;
>          *) else static if(is(T == B)) (*
>              B.SubType x;
>          *) else (*
>              T x;
>          *)
>
>          x = ... whatever
>     }
>     else
>          int y = x;
> }
>
>
> I don't like that too, even if it's a bit better than the version with ::.
>
> Two other possibilities:
>
> void doSomething(T)(int i) {
>      if (i == 0) {
>          static if (is(T == A)) {|
>              A.SomeAlias x;
>          |} else static if(is(T == B)) {|
>              B.SubType x;
>          |} else {|
>              T x;
>          |}
>
>          x = ... whatever
>     }
>     else
>          int y = x;
> }
>
>
> void doSomething(T)(int i) {
>      if (i == 0) {
>          static if (is(T == A)) {#
>              A.SomeAlias x;
>          #} else static if(is(T == B)) {#
>              B.SubType x;
>          #} else {#
>              T x;
>          #}
>
>          x = ... whatever
>     }
>     else
>          int y = x;
> }
>
> I don't think lot of people will appreciate those.
> So the lack of different block delimiters may make this problem have no better solution.
>
> Bye,
> bearophile

in C# they use the same syntax as the c pre-processor for conditional 
compilation and such even though C# doesn't have a pre-processor and the 
syntax is interpreted by the compiler. the above would be something like:

  void doSomething(T)(int i) {
       if (i == 0) {
           #if (is(T == A))
               A.SomeAlias x;
           #elif (is(T == B))
               B.SubType x;
           #else
               T x;
           #endif

           x = ... whatever
      }
      else
           int y = x;
  }

D can always revert to this kind of syntax for compile time code.



More information about the Digitalmars-d-announce mailing list