June 25, 2010
Hi,

I'm doing a review of the language reference documentation.

What I've noticed in a lot of the example code is that it is not syntactically correct. Sometimes, this is wanted behavior. For example, take this Array Length code example:

    int[4] foo;
    int[]  bar = foo;
    int*   p = &foo[0];

    // These expressions are equivalent:
    bar[]
    bar[0 .. 4]
    bar[0 .. $]
    bar[0 .. bar.length]


    p[0 .. $]		// '$' is not defined, since p is not an array
    bar[0]+$	// '$' is not defined, out of scope of [ ]

    bar[$-1]	// retrieves last element of the array

The goal of this example is to show that the dollar symbol is not available for pointers, or when it is outside the scope of the array. So the example should not compile.

The above code won't compile, which was expected, but it won't compile for a number of different reasons:

  (1) Statement terminators are missing,
  (2) The expressions have no effect, "array[2];" doesn't mean anything
to the compiler and it will complain about it, and finally
  (3) $ is undefined in those two expressions, just like noted in the comments

This is a trivial example, but other examples have even worse broken syntax. In one code example taken from the docs, I got this little monster of an error message:
        foreach_test.d(38): Error: function
        object.AssociativeArray!(const(char)[],double).AssociativeArray.opApply
        (scope int delegate(ref const(char)[], ref double) dg) is not callable
        using argument types (int delegate(ref double __applyArg0,
        ref char[] __applyArg1))

        foreach_test.d(38): Error: cannot implicitly convert expression
        (__foreachbody524) of type int delegate(ref double __applyArg0,
        ref char[] __applyArg1) to int delegate(ref double)

With all of that said, the above Array Length example would then possibly look like this instead:

    int[4] foo;
    int[]  bar = foo;
    int*   p = &foo[0];

    // These expressions are equivalent:
    writeln( bar[] );
    writeln( bar[0 .. 4] );
    writeln( bar[0 .. $] );
    writeln( bar[0 .. bar.length] );


    writeln( p[0 .. $] );		// '$' is not defined, since p is not an array
    writeln( bar[0]+$  );	// '$' is not defined, out of scope of [ ]

    writeln( bar[$-1] );	// retrieves last element of the array

Now the compiler would only complain about the undefined dollar sign, which is what the code example was trying to show in the first place.

My question to Walter/Andrei and the community is, would you rather see compilable examples which show you the same errors (if any) as noted in the code comments, or leave the code examples as they were?