On 12/12/2012 05:18 PM, Mu wrote:
> Why doesn't the below code compile?
> How to rewrite it so that it does?
> Using: DMD64 D Compiler v2.060.
> Thank you.
>
> Code:
> ----------------
>
> import std.algorithm, std.ascii, std.stdio;
>
> void main()
> {
> char[] rot13 = lowercase.dup;
>
> bringToFront(rot13[0 .. 13], rot13[13 .. $]);
> writeln(rot13);
> }
>
> ----------------
>
> Errors:
>
> /usr/include/dmd/phobos/std/algorithm.d(1762): Error: front(r1)
> is not an lvalue

This is a common pitfall of using char[] with range functions. Range functions like bringToFront() use the .front property. .front unintuitively returns dchar for a char[] range. That dchar is decoded from the UTF-8 code units of the char[].

You can use std.conv.to:

import std.algorithm, std.ascii, std.stdio;
import std.conv;

void main()
{
    dchar[] rot13 = lowercase.to!(dchar[]);

    bringToFront(rot13[0 .. 13], rot13[13 .. $]);
    writeln(rot13);
}

By dtext:

    dchar[] rot13 = lowercase.dtext.dup;

If you are dealing with ASCII, you may want to use ubyte instead. The following is one way of achieving that:

import std.array;
// ...
    ubyte[] rot13 = lowercase.map!(a => cast(ubyte)a).array;

(There must be an easier way of doing that. :))

Ali

Reply via email to