On 1/8/22 4:17 PM, kdevel wrote:

>     enum immutable (char) [] allowed_chars = [
>        'c', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'r', 't', 'v',
>        'w', 'x', 'y', 'z', '1', '2', '3', '4', '5', '6', '7', '8', '9'
>     ];
>
>     char q = uniform!allowed_chars;
>     writeln (q);
>
> complains with
>
> uni2.d(11): Error: template instance `uniform!(['c', 'f', 'g', 'h', 'j',
> 'k', 'l', 'm', 'n', 'p', 'r', 't', 'v', 'w', 'x', 'y', 'z', '1', '2',
> '3', '4', '5', '6', '7', '8', '9'])` has no value

That's because uniform's first template parameter is expected to be a type. (There are two uses of 'enum' in D and the one above is not a type, rather "this is a manifest constant".)

One might think that uniform should work with a string like "hello" but in that case what are the choices? The single string or its individual characters?

What would work in the code above is 'choice':

  char q = choice(allowed_chars);

But that hits another fact of D: arrays of chars are strings, which cannot be RandomAccessRange because individual chars must be decoded to form dchars.

Keeping the 'choice' line above and replacing two 'char's with 'dchar's in your code makes it work.

Ali

Reply via email to