April 08, 2021
I resume in the 4 ways presented,

import std;
void main(){
	auto a=[1,0,1,1,1,0,1,0,1,1,1,0];
	
	string s = format!"%-(%s%)"(a);
	writeln(s);
	
	dchar[12] b = a.map!(to!string).joiner.array;
	writeln(b);
	
	auto conv = a.to!(ubyte[]);
        conv[]+='0';
       writeln(cast(string)conv);

        auto r = a.map!(i => cast(char)(i + '0'));
	writeln(r);
}

Why do the last two ways need "auto" as type ?
April 08, 2021
On Thursday, 8 April 2021 at 22:02:47 UTC, Alain De Vos wrote:
> I resume in the 4 ways presented,
>
> import std;
> void main(){
> 	auto a=[1,0,1,1,1,0,1,0,1,1,1,0];
> 	
> 	string s = format!"%-(%s%)"(a);
> 	writeln(s);
> 	
> 	dchar[12] b = a.map!(to!string).joiner.array;
> 	writeln(b);
> 	
> 	auto conv = a.to!(ubyte[]);
>         conv[]+='0';
>        writeln(cast(string)conv);
>
>         auto r = a.map!(i => cast(char)(i + '0'));
> 	writeln(r);
> }
>
> Why do the last two ways need "auto" as type ?

auto is not a type, it's inferring the type, like var in C#. It's just convenient, saves you a few keystrokes.
April 08, 2021
So which concrete types do you give for the two auto's.
April 08, 2021

On Thursday, 8 April 2021 at 22:27:38 UTC, Alain De Vos wrote:

>

So which concrete types do you give for the two auto's.

The first auto is the return type of to!(ubyte[])--so, it's ubyte[].

The second auto is the return type of map. If you look at the documentation [2], you'll see that it doesn't give a concrete type for the return value; it just says that map returns "an input range." That's because the concrete type is a so-called "Voldemort type" [1]--a type whose name is private to the function, and can't be used externally.

Why use such a type? Because it gives the authors of map the freedom to change the concrete type without breaking code that uses map, as long as the type they change it to still supports the input range interface.

[1] https://wiki.dlang.org/Voldemort_types
[2] https://phobos.dpldocs.info/std.algorithm.iteration.map.map.html

April 09, 2021
On Thursday, 8 April 2021 at 22:27:38 UTC, Alain De Vos wrote:
> So which concrete types do you give for the two auto's.

Like Paul said.

But if you really wanted to type it out:

a is int[], conv is ubyte[] and the map is lazy, so add .array and it evaluates to char[]




April 09, 2021
On Thursday, 8 April 2021 at 04:02:26 UTC, Ali Çehreli wrote:
> On 4/7/21 8:57 PM, Brad wrote:
>
>>      auto a = [1,0,1,1,1,0,1,0,1,1,1,1,0];
>
>> I want to come out of this with a string that looks like this: 1011101011110
>
> Me, me, me, me! :)
>
> import std;
> void main()
> {
>   auto a = [1,0,1,1,1,0,1,0,1,1,1,1,0];
>
>   string s = format!"%-(%s%)"(a);
>   writeln(s);
> }
>
> Ali

I'm really addict to the new shortened methods syntax

import std;
void main() =>
    [1,0,1,1,1,0,1,0,1,1,1,0].
    format!"%-(%s%)".
    writeln;
April 11, 2021

On Thursday, 8 April 2021 at 18:06:25 UTC, Meta wrote:

>

On Thursday, 8 April 2021 at 18:01:56 UTC, Meta wrote:

>

On Thursday, 8 April 2021 at 12:19:29 UTC, WebFreak001 wrote:

>
string to01String(int[] x) @safe
{
    auto conv = x.to!(ubyte[]); // allocates new array, so later cast to string is OK
    conv[] += '0'; // assume all numbers are 0-9, then this gives the correct result
    return (() @trusted => cast(string)conv)();
}

The @trusted lambda can also be replaced with std.exception.assumeUnique.

Never mind me, assumeUnique is @system (or at least it's inferred as @system), and anyway, you can't implicitly convert immutable(ubyte)[] to immutable(char)[].

It has to be. It's not @safe quite obviously.

1 2
Next ›   Last »